顺序栈
顺序栈的实现,利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针top指示当前栈顶元素的位置。
销毁栈时,置 i=-1,即可,余下的待运行结束后由系统自动回收。
//栈的顺序存储结构,用静态数组实现
#include<stdio.h>
#define MaxSize 20//定义栈中元素的最大个数
typedef struct{
int data[MaxSize];//存放栈中的元素
int top;//栈顶指针
}SqStack;//顺序栈
void InitStack(SqStack &s){
s.top=-1;//初始化栈顶指针
}
bool StackEmpty(SqStack s){
return s.top==-1;
}
bool Push(SqStack &s,int x){
if(s.top == MaxSize-1){
printf("overflow\n");
return false;
}
s.data[++s.top]=x;
return true;
}
bool Pop(SqStack &s,int &x){
if(s.top == -1){
printf("s.top == -1\n");
return false;
}
x = s.data[s.top--];
return true;
}
bool GetTop(SqStack s,int &x){
if(s.top == -1){
printf("s.top == -1\n");
return false;
}
x = s.data[s.top];
return true;
}
bool DestroyStack(SqStack &s){
s.top=-1;
}
bool PrintStack(SqStack s){
int p=s.top;
if(p==-1){
printf("\n栈空\n");
return false;
}
printf("Stack is :");
while(p!=-1){
printf("%d ",s.data[p--]);
}
printf("\n");
}
int main(){
SqStack s;
InitStack(s);
for(int i=1;i<9;i++){
printf("i=%d\n",i);
Push(s,i);
}
int e;
printf("\nPop:");
for(int i=4;i>0;i--){
Pop(s,e);
printf("%d ",e);
}
printf("\nGetTop 应该是 4?\n");
GetTop(s,e);
printf(" %d \n",e);
PrintStack(s);
DestroyStack(s);
PrintStack(s);
return 0;
}
共享栈
利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空降,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
栈满的判断条件:top2 == top1 + 1
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。
//共享栈
#define MaxSize 50
typedef struct{
int data[MaxSize];
int top1;//1号栈栈顶指针
int top2;//2号栈栈顶指针
}ShareStack;
void InitShareStack(ShareStack &s){
S.top1=-1;
S.top2=MaxSize;//@@@
}
//栈满的判断条件:top2 == top1 + 1