数据结构--顺序栈

时间:2022-08-25 10:28:40
/*
* 构造一个顺序栈(当输入9999时,结束入栈操作),输出栈中元素,显示栈顶元素,删除栈顶元素
*/

#include <stdio.h>
#include <stack>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define OK 1
#define ERROR 0
typedef int SElemType;
//顺序栈结构体
struct SqStack
{
int *base;//指向栈底的指针
int *top;//指向栈顶元素下一个位置的指针
int stacksize;//栈的大小
};
//1.初始化顺序栈
int InitStrack(SqStack &S){
S.base = new SElemType[STACK_INIT_SIZE];//为顺序栈动态分配内存
if(!S.base){ //分配失败
exit(1); //退出程序,参数0表示正常退出,非0表示异常退出
}
S.top = S.base; //top初始为base,表示空栈
S.stacksize = STACK_INIT_SIZE; //栈的最大容量
return OK;
}
//2.入栈
int Push(SqStack &S,SElemType e){
if(S.top - S.base == S.stacksize){ //表示栈满,增加空间
int *newbase; //指针用于指向新生成的空间位置
newbase=new int[S.stacksize*2]; //重新开辟一个空间
if(newbase==0)
return 0; //内存分配失败,返回0
for (int i=0;i<=S.stacksize-1;i++)
{ //将原有栈中的元素拷贝到新栈中
newbase[i]=S.base[i];
}
delete S.base; //删除原有栈的空间
S.base=newbase; //原有栈的栈底指针指向新栈空间
S.top=&S.base[S.stacksize]; //新栈栈顶元素的下一个位置
S.stacksize *=2;
}
//*S.top++ = e; //元素压入栈中,指针S.top加加
*S.top=e;
S.top++;
return OK;
}
//3.出栈
int Pop(SqStack &S){
if(S.top == S.base){
printf("空栈!");
return ERROR;
}
--S.top;
return OK;
}
//4.取栈顶元素
SElemType GetTop(SqStack S){
if(S.top != S.base){
return *(S.top - 1);
}
return 00;
}
//5.打印,输出
void Print(SqStack S)
{//打印栈中元素,顺序是从栈底到栈顶
int *p=S.base;
while (p<S.top)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
//主函数
int main(void){
SqStack S;
int x,y;
InitStrack(S);
printf("Enter Numbers:\n");
while(true){
scanf("%d",&x);
if(x == 9999){
break;
}
Push(S,x); //构造顺序栈
}
printf("The stack elems:");
Print(S);
printf("1.入栈:");
scanf("%d",&x);
Push(S,x);
printf("The stack elems:");
Print(S);
y = GetTop(S);
printf("2.取得栈顶元素:%d\n",y);
printf("3.出栈:\n");
Pop(S);
printf("The stack elems:");
Print(S);

}