主要介绍出栈,入栈,栈的初始化,栈的遍历,以及得到首元素
栈的数据结构参考严蔚敏的《数据结构》。
完整代码如下:
#define TRUE 1
#define ERROR -1
#define OVERFLOW -1
#define INIT_STACK_SIZE 100
#define SIZEINCREMENT 10
typedef int Elemtype;
typedef int Status;
typedef struct{
Elemtype *base;
Elemtype *top;
int size;
}SqStack;
//初始化
Status InitStack(SqStack &s){
s.base=(Elemtype *)malloc(INIT_STACK_SIZE*sizeof(Elemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.size=INIT_STACK_SIZE;
return TRUE;
}
//得到栈顶元素
Status Gettop(SqStack s,Elemtype &e){
if(s.top==s.base) return ERROR;
e=*(s.top-1);
return TRUE;
}
//入栈
Status Push(SqStack &s,Elemtype e){
if(s.top-s.base>=s.size){
s.base=(Elemtype *)realloc(s.base,(s.size+SIZEINCREMENT)*sizeof(Elemtype));
if(!s.base) return ERROR;
s.top=s.base+s.size;
s.size+=SIZEINCREMENT;
}
*s.top++=e;
return TRUE;
}
//出栈
Status Pop(SqStack s, Elemtype &e){
if(s.top==s.base) return ERROR;
e=*--s.top;
return TRUE;
}
//遍历输出
Status PrintStack(SqStack &s){
Elemtype *i;
if(s.top==s.base) return ERROR;
for(i=s.base;i<s.top;i++){
cout<<*i<<" ";
}
return TRUE;
}
int main(){
cout<<"请输入顺序栈中的元素个数:"<<endl;
int m;
Elemtype e;
cin>>m;
SqStack s;
InitStack(s);
cout<<"请输入该元素的数据:"<<endl;
while(m--!=0){
cin>>e;
Push(s,e);
//Gettop(s,e);
//cout<<e<<endl;
//cout<<"cc"<<endl;
//PrintStack(s);
}
cout<<"该栈中元素为:"<<endl;
PrintStack(s);
}
效果图如下,其中Push操作实现了元素的插入
栈的数据结构中用base指针存储栈底元素的地址,top指针存储栈顶元素的地址,遍历时从base开始,由于是连续的存储空间,所以可以线性加减实现遍历。
栈顶指针永远在栈顶元素的下一个位置上,获取栈顶元素时需要注意;需要修改栈中元素时参数的传递加上&引用符号可以实现实参内容的变化,具体传递参数时仍传递的是变量名。