顺序栈的基本概念
栈是受限的线性表,其只允许在栈首进行插入和删除操作。栈在表达式求值、过程调用、递归过程和消除递归中有很中很要的作用。栈基于顺序结构的好处是避免了指针的使用(可用整数来表是栈首的位置)易于理解,但缺点是大小固定(解决方法是动态的分配内存,具体可参见我的动态分配顺序表一文,这里不过多赘述)。我这里采用了带首尾指针的栈,这样的栈可以很好的去实现输出或输入受限的栈,感兴趣的同学可以在我的继基础上去实现一下两端输出或输入受限的栈。
栈基本操作的实现(基于顺序结构)
存储结构
使用数组来存储,使用下表来表示栈首。
typedef struct Stack{
ElemType data[MAXSIZE];
int top,bottom; //top为头指针,bottom为尾指针
};
初始化操作
这里的top指针指向栈顶的上一个位置,由于C语言下表的起始,top数值就可以表示栈中的元素个数了
//初始化栈
Stack* initStack(){
Stack* T;
T = (Stack*)malloc(sizeof(Stack));
T->top = 0;
T->bottom = 0;
return T;
}
入栈操作
利用上述top数值与元素个数的关系可以很容易的判断栈是否为空
//入栈操作
void push(Stack* T,ElemType e){
i