数据结构-栈

作者: 1江春水 | 来源:发表于2019-04-23 17:58 被阅读3次

特性:后进先出 LIFO

基本概念

  • 栈是运算受限的线性表,插入和删除限定在表的一端进行操作;
  • 栈顶:允许插入删除的一端称为栈顶,另一端称为栈底;
  • 栈顶元素:处于栈顶位置的元素称为栈顶元素;
  • 空栈:不含任何数据元素的栈称为空栈;

栈的基本运算

  1. 初始化:构造一个空栈
  2. 判栈空
  3. 进栈:将元素x插入栈中,使x成为栈顶元素
  4. 出栈:删除栈顶元素
  5. 取栈顶元素:返回栈顶元素

栈的顺序存储结构和链式存储结构

顺序存储

栈的顺序存储结构是使用一组连续的存储单元依次存放栈中的每个元素,并用始端作为栈底,称为顺序栈;通常使用一维数组和一个记录栈顶的变量来实现。

C语言实现

const int maxsize = 10;//最大栈容量
typedef struct {
    int top;
    int data[maxsize]; //数据类型为int
}SeqStack;


//初始化
SeqStack * initStack(void) {
    SeqStack *stack = (SeqStack *)malloc(sizeof(SeqStack));
    stack->top = 0;
    return stack;
}

//判栈空
int emptyStack(SeqStack *s) {
    if (s->top == 0) {
        return 1;
    }
    return 0;
}

//进栈
void push(SeqStack *s,int x) {
    if (s->top < maxsize-1) {
        s->data[s->top+1] = x;
        s->top++;
    } else {
        printf("栈已满");
    }
}

//出栈
void pop(SeqStack *s) {
    if (emptyStack(s)) {
        printf("已是空栈");
    } else {
        s->top--;
    }
}

//取栈顶元素
int getTop(SeqStack *s) {
    if (emptyStack(s)) {
        return -1;
    }
    return s->data[s->top];
}

OC实现

.h文件

@interface Stack : NSObject
- (void)push:(int)x;
- (void)pop;
- (int)getTop;
- (BOOL)emptyStack;
@end

.m文件

- (instancetype)init {
    self = [super init];
    if (self) {
        _data = [NSMutableArray array];
    }
    return self;
}

- (void)push:(int)x {
    NSNumber *n = [NSNumber numberWithInt:x];
    if (n) {
        [self.data addObject:n];
    }
}

- (void)pop {
    [self.data removeLastObject];
}

- (BOOL)emptyStack {
    if (self.data.count) {
        return NO;
    }
    return YES;
}

- (int)getTop {
    return [[self.data lastObject] intValue];
}
栈的链式存储

C语言实现

typedef struct node {
    int data;//数据类型
    struct node *next;
}LinkStack;

//初始化
LinkStack *initLinkStack() {
    LinkStack *ls = (LinkStack *)malloc(sizeof(LinkStack));
    ls->next = NULL;
    return ls;
}

//判空
int emptyStack(LinkStack *s) {
    if (s->next == NULL) {
        return 1;
    }
    return 0;
}
//进栈
void push(LinkStack *s,int x) {
    LinkStack *temp = (LinkStack *)malloc(sizeof(LinkStack));
    temp->data = x;
    temp->next = s->next;
    s->next = temp;
}

//出栈
void pop(LinkStack *s) {
    if (emptyStack(s)) {
        printf("空栈");
    } else {
        LinkStack *pre = s->next;
        s->next = pre->next;
        free(pre);
    }
}
//获取栈顶元素
int getTop(LinkStack *s) {
    if (!emptyStack(s)) {
        return s->next->data;
    }
    return -1;
}

简单应用-链表反转

void reverseList(linkList head) {
    LinkStack *stack = initLinkStack();
    Node *pre = head->next;
    while (pre != NULL) {
        push(stack, pre->data);
        pre = pre->next;
    }
    
    pre = head->next;
    while (!emptyStack(stack)) {
        pre->data = getTop(stack);
        pop(stack);
        pre = pre->next;
    }
}
顺序栈、链栈的比较
  • 顺序栈需要提前指定栈的大小,链栈不需要
  • 顺序栈有 上溢(数据个数超出了最大值) 和 下溢(空栈时出栈) 概念
  • 链栈没有上溢限制
  • 链栈不需要附加头结点

相关文章

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 004 go语言实现栈

    1 数据结构 数据结构: 要实现的功能:0 栈的初始化1 获取栈长度2 入栈3 出栈4 清空栈内容5 判断栈是否为...

  • java高级知识点

    1.数据结构 程序=数据结构+算法 栈:后进先出,线性结构 入栈:push 出栈:pop假如已知入栈顺序是ab...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

  • 数据结构与算法 第二节:栈 栈: 一种先进后出的数据结构。可以想象成手枪的弹夹。 栈的特点: 栈的行为: 栈的代...

  • 2019-07-11—栈

    栈:Java数据结构和算法(四)——栈 string和char一般这么转化: 21、定义栈的数据结构,请在该类型中...

  • 什么是堆栈?

    堆与栈是两种数据结构,并不是一种数据结构,堆是堆,栈是栈。 1、栈:是一种只能在一端进行插入和删除的数据结构。 允...

  • 05--栈 递归

    栈 栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线...

  • 18-04-21 python3 算法笔记 002基本数据结构

    线性数据结构 栈,队列,deques,列表其元素在数据结构中的位置由它被添加时的顺序决定。 栈 后进先出栈 LI...

  • 数据结构

    数据结构:要写!!手动!!数据结构非常简洁才可 栈 eg. 弹栈压栈的过程 链表 就是原型链不断的连接,要断去某个...

网友评论

    本文标题:数据结构-栈

    本文链接:https://www.haomeiwen.com/subject/apjbgqtx.html