堆栈是一种特殊的线性表。
堆栈中的数据元素以及数据元素间的逻辑关系和线性表完全相同,差别是:线性表允许在任意位置插入和删除数据元素,但是堆栈值允许在固定的一段进行插入和删除数据操作。
堆栈中允许插入和删除操作的一段称为栈顶,另外一端称为栈底。
栈顶当前的位置是动态的,标识栈顶当前位置的变量称为栈顶指示器(栈顶指针)。
堆栈的插入和删除操作通常称为入栈和出栈。
因为最后进入堆栈中的元素总是最先出来的,所以堆栈又被称为后进先出表。
输入堆栈的数据元素是一种序列,输出堆栈的数据元素是另外一种序列。所以堆栈完成的功能,实际上是从某种数据元素序列到另外一种数据元素序列的转换。
例如:在编译软件系统中,需要频繁地把中缀表达式形式的算术表达式转换成后缀表达式形式的算术表达式。
*************************************************************************************************************************
顺序存储结构的堆栈称为顺序堆栈。
这里主要实现五个操作
1、初始化
2、判断是否为空
3、入栈
4、出栈
5、取栈顶元素
#define MaxStackSize 100 typedef int DataType; typedef struct{ DataType stack[MaxStackSize]; int top; //use to point the stack top }SeqStack; /*初始化*/ void stackInit(SeqStack *s){ s->top = 0; } /*判断是否为空*/ int stackEmpty(SeqStack *s){ if(s->top <= 0) return 1; else return 0; } /*入栈*/ int stackPush(SeqStack *s, DataType x){ if(s->top >= MaxStackSize){ printf("the stack is full! "); return 0; } s->stack[s->top] = x; s->top ++; return 1; } /*出栈*/ DataType stackPop(SeqStack *s, DataType *x){ if(s->top <= 0){ printf("the stack is empty!"); return 0; } s->top --; *x = s->stack[s->top]; return 1; } /*取栈顶元素*/ DataType stackGet(SeqStack *s){ int i; if(s->top <= 0){ printf("the stack is empty!"); return 0; } i = s->top -1; return s->stack[i]; }
*************************************************************************************************************************
链式结构存储的堆栈称为链式堆栈。
对链式堆栈来说,若把靠近头指针的一段定义为栈顶,则插入元素和删除元素时不需要遍历整个链,其时间复杂度为O(1);
否则,若把远离头指针的一段定义为栈顶,那么插入和删除元素就需要遍历整个链表,时间复杂度为O(n)。所以,通常链式堆栈都设计成靠近指针的一端定义为栈顶。