码迷,mamicode.com
首页 > 其他好文 > 详细

栈操作及其应用

时间:2018-09-25 20:43:19      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:++   下标   amp   数组   顺序   else   一个   error   ret   

栈可以是顺序栈,也可以是链栈。

顺序栈:

 1 const int maxSize = 100;
 2 // 顺序栈
 3 struct SqStack{
 4     int data[maxSize];
 5     int top;
 6 }
 7 
 8 void initStack(SqStack &s)
 9 {
10     s.top=-1;
11 }
12 
13 int isEmpty(SqStack s)
14 {
15     if(s.top == -1)
16         return 1;
17     else
18         return 0;
19 }
20 
21 int push(SqStack &s,int x)
22 {
23     if(s.top == maxSize-1)
24         return 0;
25     ++(s.top);
26     s.data[s.top]=x;
27     return 1
28 }
29 
30 int pop(SqStack &s,int &x)
31 {
32     if(s.top==-1)
33         return 0;
34     x = s.data[s.top];
35     --(s.top);
36     return 1;
37 }

 

顺序栈还可以更简化,使用数组来创建:

1 //简化版顺序栈
2 int stack[maxSize];   
3 int top = -1;             //  初始化栈
4 stack[++top] = x;   //  进栈
5 x = stack[top--];     //  出栈

 

链栈:

 1 // 链栈
 2 struct LNode{
 3     int data;
 4     LNode *next;
 5 }
 6 
 7 void InitStack(LNode *&lst)
 8 {
 9     lst = new LNode;
10     lst->next = NULL;
11 }
12 
13 int isEmpty(LNode *lst)
14 {
15     if(lst->next == NULL)
16         return 1;
17     else
18         return 0;
19 }
20 
21 void push(LNode *lst,int x)
22 {
23     LNode *p;
24     p = new LNode;
25 
26     p->data = x;
27     p->next = lst->next;
28     lst->next = p;
29 }
30 
31 int pop(LNode *lst,int &x)
32 {
33     LNode *p;
34     if(lst->next == NULL)
35         return 0;
36     p = lst->next;
37     x = p->data;
38     lst->next = p->next;
39     free(p);
40     return 1;
41 }

 

栈的应用:

1. 编写算法,判断一个算术表达式中的括号是否配对。表达式已经存入字符数组中,元素从下标1开始存储,表达式中的字符个数为n

思路:遍历这个表达式,当遇到第一个 ‘(‘ 时,入栈,继续遍历,如果遇到 ‘)‘ ,则将 ‘(‘ 出栈,划掉这两个括号,继续处理下一组括号。如果前面所有括号都被划掉,而下一个括号却是 ‘)‘ ,

则括号不匹配,因为前面已经没有与之匹配的 ‘(‘ 了。如果下一个括号还是 ‘(‘ ,则先处理这个括号,处理完再处理前面的 ‘(‘ 。

 1 int match(char exp[],int n)
 2 {
 3     char stack[maxSize];
 4     int top = -1;
 5  
 6     int i;
 7     for(i=1;i<=n;++i){
 8         if(exp[i]==()
 9             stack[++top]=(;
10         if(exp[i]==)){
11             if(top==-1)
12                 return 0;
13             else
14                 --top;
15         }
16     }
17     if(top==-1)   // 所有括号都被处理掉了,返回1
18         return 1;   
19     else              // 否则返回0
20         return 0;
21 }

 

2.编写一个函数,求后缀表达式的值。(即逆波兰表达式的值)   表达式被存于一个字符数组中,以‘\0‘结尾,并假设后缀表达式中的数字都只有一位。

先定义一个运算函数:

 1 int op(int a,char op, int b)
 2 {
 3     if(op==+) return a+b;
 4     if(op==‘‘-) return a-b;
 5     if(op==‘‘*) return a*b;
 6     if(op==/){
 7         if(b==0){
 8             cout<<"Error"<<endl;
 9             return 0;
10         }else
11             return a/b;
12     }
13 }

后缀表达式计算函数:

 1 int com(char exp[])
 2 {
 3     int a,b,c;   //   a、b为操作数,c存储计算结果
 4     int stack[maxSize];
 5     int top = -1;
 6 
 7     char op;
 8     for(i=0;exp[i]!=\0;i++){
 9         if(exp[i]>=0&&exp[i]<=9)
10             stack[++top]=exp[i]-0;
11         else{
12             op = exp[i];
13             a=stack[top--];
14             b=stack[top--];
15       //  注意,根据后缀表达式的计算方式,应该用后出栈的数op先出栈的数
16             c=op(b,op,a);   
17             stack[++top]=c;
18         }   
19     }
20     return stack[top];
21 }

 

 

 

栈操作及其应用

标签:++   下标   amp   数组   顺序   else   一个   error   ret   

原文地址:https://www.cnblogs.com/ll-10/p/9702962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!