#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;
typedef struct{
int top;
ElemType data[MaxSize];
}SqStack;
//初始化栈
int InitStack(SqStack *S){
S->top = -1;
}
//栈判空
int StackEmpty(SqStack *S){
if(S->top == -1)
printf("此栈空。\n");
else
printf("此栈非空。\n");
}
//进栈
int Push(SqStack *S,ElemType e){
if(S->top == MaxSize-1)
printf("栈满,不可添加新元素。");
S->data[++S->top] = e;
return ;
}
//出栈
int Pop(SqStack *S,ElemType *e){
if(S->top == -1)
printf("此栈空。\n");
e = S->data[S->top--];
return ;
}
//获取栈顶元素
int GetTop(SqStack *S){
if(S->top == -1)
printf("此栈空。\n");
printf("%d\n",S->data[S->top]);
return ;
}
//清空栈
int ClearStack(SqStack *S){
S->top = -1;
return ;
}
//求栈长
int StackLength(SqStack *S){
if(S->top == -1)
printf("此栈为空。\n");
else
printf("%d\n",S->top+1);
}
//打印栈内元素
int PrintStack(SqStack *S){
if(S->top == -1)
printf("此栈空。\n");
ElemType e;
int n = S->top;
while(n!=-1){
e = S->data[n];
printf("% .d",e);
n--;
}
printf("\n");
return ;
}
int main()
{
SqStack S;
printf("构造一个空栈...\n");
InitStack(&S);
int n;
printf("请输入栈的初始长度:");
scanf("%d",&n);
printf("请依次输入栈的初始元素:\n");
for(int i=1;i<=n;i++)
{
int e;
printf("元素%d: ",i);
scanf("%d",&e);
Push(&S,e);
}
printf("此栈长: ");
StackLength(&S);
printf("遍历打印栈内元素:");
PrintStack(&S);
printf("获取栈顶元素: ");
GetTop(&S);
int e;
printf("删除栈顶元素后的栈:");
Pop(&S,&e);
PrintStack(&S);
printf("请输入需要插入的元素:");
scanf("%d",&e);
Push(&S,e);
printf("插入元素后的栈:");
PrintStack(&S);
printf("清空栈。");
ClearStack(&S);
printf("完成!");
return 0;
}
1.栈的基本概念
栈(Stack):只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作;
栈顶(Top):线性表允许进行插入和删除的那一端;
栈底(Bottom):固定,不允许进行插入和删除的一端;
空栈:不含任何元素的空表。
2.栈的基本操作
InitStack(&S):初始化一个空栈S;
StackEmpty(&S):判断一个栈是否为空;
Push(&S,e):进栈,若栈S未满,将e压入栈,成为新栈顶;
Pop(&S,&e):出栈,若栈非空,弹出栈顶元素,并用e储存;
GetTop(&S):获取栈顶元素;
Clear Stack(&S):清除并销毁栈。
(注:符号‘&’是C++特有的,用来表示引用,C语言中使用‘*’也可达到传址的目的。)
栈顶指针:S->top,初始时设置S->top = -1,栈顶元素S->data[S->top];
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素;
出栈操作:栈非空时,先取栈顶元素,再将栈顶指针减1;
栈空条件:S->top == -1;栈满条件:S->top == MaxSize -1;栈长:S->top+1;