系列文章目录
第三话 数据结构之栈
文章目录
- 一、了解什么是栈
- 二、栈的基本特征
- 三、栈的基本操作步骤
- 1.存储结构
- 2.基本操作
- 3.实现运用
- 四、总结
前言
在软件设计中常用这样的数据结构,一种是进去得越早,出来得越晚。另一种是进去得越早,出来得越早。栈是执行“后进先出”规则的数据结构,设想有一个直径不大且一端封闭的竹筒,将若干个写有不同编号的小球放入竹筒里面,只能一个个一次放入,最后发现先放进去的小球只能后拿出来。
一、什么是栈?
生活中常常见到后进先出的例子,比如桶装薯片,薯片一片片放进去,吃的第一片肯定是最后放进去的;比如一叠堆起的盘子或盒子,取的第一个一定是最后放上去的;比如手枪子的弹匣,一粒一粒压进去,最后压进去的先打出来,最后压进去的最后打出来,而描述这种应用的数据结构就是栈。
二、栈的基本特征
1.后进先出
后进先出或者先进后出,最后进去的最先出来
2.一端性
栈是只能在一端进行插入和删除的线性表
三、栈的基本操作
1、定义存储结构--顺序存储
typedef int Elemtype;
typedef struct{
Elemtype date[maxsize];
int top;
}Stack;
2、将栈初始化
Stack *init_stack()
{
Stack *s;
s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
3、入栈操作
int push(Stack *s,Elemtype x)
{
if(s->top==maxsize-1){
printf("栈已满");
return 0;
}else{
s->top++;
s->date[s->top] = x;
return 1;
}
}
4、出栈操作
int pop(Stack *s,Elemtype *x)
{
if(s->top=-1){
printf("栈空,无法出栈\n");
return 0;
}else{
*x = s->date[s->top];
s->top--;
return 1;
}
}
5、在主行数中实现调用
int main(void)
{
Stack *s1;
s1 = init_stack();
Elemtype x;
int i,cnt = 0;
printf("输入入栈元素,输入-1表示结束:\n");
scanf("%d",&x);
while(x!=-1){
cnt++;
push(s1,x);
scanf("%d",&x);
}//将入栈的数据输入
for(i=0;i<cnt;i++){
Pop(s1,&x);
printf("x = %d\n",x);
}//将入栈的数据输出
return 0;
}
四、总结
由于栈是动态变化的数据结构,使用顺序栈时虽然可在某种程度上满足这种动态操作,但是一般数组长度的定义总是有限度的。为了克服这个弱点,在之后可以采用链式存储结构来描述栈