对stack概念的理解与应用

本文介绍了栈的数据结构特性及基本操作,通过代码实例展示了如何使用栈进行元素的入栈、出栈、判断栈是否为空、获取栈顶元素以及打印栈中所有元素的功能。并以算术表达式求值为例,演示了栈在程序设计中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stack,中文翻译做“栈”,特点就是先进后出,后进先出。

像盖房子一样,新的数据总是被放在上层,若要取数据,就像拆房子,不要太暴力的方式,就要从顶层一层层往下拆。

stack有几种操作,push——进栈,pop——出栈,isempty——检查是否为空栈,top——栈顶元素位置。

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #define DataType int
 4 #define MAXSIZE 1024
 5 typedef struct
 6 {
 7     DataType data[MAXSIZE];
 8     int top;
 9 }SeqStack;
10 SeqStack *Init_SeqStack()//栈初始化
11 {
12     SeqStack *s;
13     s=(SeqStack *)malloc(sizeof(SeqStack));//申请空间
14     if(!s)
15     {
16         printf("空间不足\n");
17         return NULL;
18     }
19     else
20     {
21         s->top=-1;
22         return s;
23     }
24 }
25 int Empty_SeqStack(SeqStack *s)//判栈空
26 {
27     if(s->top==-1) return 1;
28     else return 0;
29 }
30 int Push_SeqStack(SeqStack *s,DataType x)//入栈
31 {
32     if(s->top==MAXSIZE-1) return 0;//栈满不能入栈
33     else
34     {
35         s->top++;//栈顶+1
36         s->data[s->top]=x;//将元素放入data数组中
37         return 1;
38     }
39 }
40 int Pop_SeqStack(SeqStack *s,DataType *x)//出栈
41 {
42     if(Empty_SeqStack(s)) return 0;//栈空不能出栈
43     else
44     {
45         *x=s->data[s->top];
46         s->top--;//栈顶-1
47         return 1;
48     }//栈顶元素存入*x,返回
49 }
50 DataType Top_SeqStack(SeqStack *s)//取栈顶元素
51 {
52     if(Empty_SeqStack(s)) return 0;//栈空
53     else return s->data[s->top];
54 }
55 int Print_SeqStack(SeqStack *s)//打印栈中所有元素
56 {
57     int i;
58     printf("当前栈中的元素:\n");
59     for(i=s->top;i>=0;i--) printf("%3d",s->data[i]);
60     printf("\n");
61     return 0;
62 }
63 int main()
64 {
65     SeqStack *L;
66     int n,num,m;
67     int i;
68     L=Init_SeqStack();
69     printf("初始化完成\n");
70     printf("栈空:%d\n",Empty_SeqStack(L));
71     printf("请输入入栈元素个数:\n");
72     scanf("%d",&n);
73     printf("请输入要入栈的%d个元素:\n",n);
74     for(i=0;i<n;i++)
75     {
76         scanf("%d",&num);
77         Push_SeqStack(L,num);
78     }
79     Print_SeqStack(L);
80     printf("栈顶元素:%d\n",Top_SeqStack(L));
81     printf("请输入要出栈的元素个数(不能超过%d个):\n",n);
82     scanf("%d",&n);
83     printf("依次出栈的%d个元素:\n",n);
84     for(i=0;i<n;i++)
85     {
86         Pop_SeqStack(L,&m);
87         printf("%3d",m);
88     }
89     printf("\n");
90     Print_SeqStack(L);
91     printf("栈顶元素:%d\n",Top_SeqStack(L));
92     return 0;
93 }
View Code

借助百度百科对于栈的介绍,利用链表的形式建了个栈,可以实现基本的操作,如进栈、出栈、判断空、打印栈中元素、返回栈顶元素。

听学长讲,貌似可以调用#include<vector>库实现对栈的操作。

栈在程序设计时有很多应用,举个最近正在用的例子,算术表达式求值。

例如对于中缀表达式3/5+8,将其改写为后缀表达式形式3 5 / 8 +,这就可以用栈进行计算了。

运算原理就是碰到数字就进栈,碰到运算符就取出栈顶前两个元素和此运算符进行运算,得到的数字再进栈,最后栈里的唯一元素即为值。

如1 2 + 8 2 - 7 4 - / *

步骤栈中元素说明
111进栈
2122进栈
3 遇+号退栈2和1
431+2=3的结果3进栈
5388进栈
63822进栈
73遇-号退栈2和8
8368-2=6的结果6进栈
93677进栈
1036744进栈
1136遇-号退栈4和7
12367-4=3的结果3进栈
133遇/号退栈3和6
14326/3=2的结果2进栈
15 遇*号退栈2和3
1663*2=6进栈
176扫描完毕,运算结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

中缀表达式转后缀表达式算法则为,建一个空栈存放运算符,遇到数字直接输出,并输出一个空格分隔开两个数字,遇到运算符则与栈顶元素比较优先级,大于就进栈,否则推出栈顶元素并输出,并输出一个空格分隔,遇到左括号进栈,遇到右括号则一直退栈输出,直到退到左括号止。当栈变成空时,输出的结果即为后缀表达式。

如(1+2)*((8-2)/(7-4))

步骤栈中元素输出结果说明
1( (进栈
2(1输出1
3(+1+进栈
4(+1 2输出2
5 1 2 ++退栈输出,退栈到(止
6*1 2 +*进栈
7*(1 2 +(进栈
8*((1 2 +(进栈
9*((1 2 + 8输出8
10*((-1 2 + 8输出2
11*((-1 2 + 8 2- 进栈
12*(1 2 + 8 2 --退栈输出,退栈到(止
13*(/1 2 + 8 2 -/ 进栈
14*(/(1 2 + 8 2 -( 进栈
15*(/(1 2 + 8 2 - 7输出7
16*(/(-1 2 + 8 2 - 7-进栈
17*(/(-1 2 + 8 2 - 7 4输出4
18*(-1 2 + 8 2 - 7 4 --退栈输出,退栈到(止
19*1 2 + 8 2 - 7 4 - //退栈输出,退栈到(止
20 1 2 + 8 2 - 7 4 - / **退栈并输出

转载于:https://www.cnblogs.com/yimingzou/p/3487776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值