【数据结构】用栈解决表达式求值问题

题目:求4+4/2-9*3的值;

思路:

  ①:用一个字符型数组存放了表达式《4+4/2-9*3》;

1 char val[9] = {'4','+','4','/','2','-','9','*','3'};

  ②:定义两个栈,一个存放数字,一个存放符号;

 1 //定义存储整型的栈
 2 typedef struct node
 3 {
 4     int data[MAXSIZE];
 5     int top;
 6 }SeqStack;
 7 //定义存储字符型的栈
 8 typedef struct nodeb
 9 {
10     char data[MAXSIZE];
11     int top;
12 }SeqStackchar;

  ③:定义符号的优先级;

 1 //获取优先级
 2 int youxianquan(char c)
 3 {
 4     int x;
 5     switch(c)
 6     {
 7         case '-':
 8         case '+':
 9             x = 1;
10             break;
11         case '*':
12         case '/':
13             x = 2;
14             break;
15         default: printf("error");
16     }
17     return(x);
18 }

  ④:确定运算思路——自左扫描表达式的每一个字符时,若当前字符是运算数值,入整型栈。是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低,则从对象栈出栈两个运算量,从运算符栈出栈一个运算符进行运算,将其运算结果入对象栈。然后继续判断当前字符串是否高于栈顶运算符,如果比栈顶运算符高,则入栈,否则则继续运算。

 1 //表达式求值
 2 int result(SeqStack *a, SeqStackchar *b)
 3 {
 4     char val[9] = {'4','+','4','/','2','-','9','*','3'};        //创建表达式
 5     int i,resultval;
 6     int x,y;
 7     char c;
 8     int n = sizeof(val);
 9     for(i = 0; i < n; i++)
10     {
11         c = val[i];        //获取表达式第i个值
12         if(i%2 == 0)    //把数字和符号区分开来,
13         {
14             a->top++;
15             a->data[a->top] = c - '0';    //存放数值的
16         }
17         else        //存放符号的
18         {
19             if(b->top == -1)        //如果b为空则直接存入符号
20             {
21                 b->top++;
22                 b->data[b->top] = c;
23             }
24             else
25             {
26                 x = youxianquan(c);                //求出当前符号的优先级
27                 y = youxianquan(b->data[b->top]);    //求b栈顶的符号优先级
28                 if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
29                 {
30                     b->top++;
31                     b->data[b->top] = c;
32                 }
33                 else        
34                 {
35                     resultval = abyunsuan(a,b);        //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a;
36                     y = youxianquan(b->data[b->top]);        //继续判断表达式第i个值的优先级是否大于栈顶符号的优先级
37                     if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
38                     {
39                         b->top++;
40                         b->data[b->top] = c;
41                     }
42                     else        //否则重复上面的操作对a的前两个出栈值和b的栈顶出栈并且运算
43                     {
44                         resultval = abyunsuan(a,b);
45                         //由于每次循环都会对b的栈顶符号的优先级做对比,所以优先级的对比只做一次即可
46                         b->top++;            //把当前的符号进b栈
47                         b->data[b->top] = c;
48                     }
49                 }
50             }
51         }
52         while(i == n - 1 && a->top != -1 && b->top != -1)        //当运算符输入完时
53         {
54             resultval = abyunsuan(a,b);
55         }
56     }
57     return resultval;    
58 }
 1 //a出栈两个值 b出栈栈顶运算符,进行运算
 2 int abyunsuan(SeqStack *a, SeqStackchar *b)
 3 {
 4     int fir,sec,resultval;
 5     char topchar;
 6     fir = a->data[a->top];
 7     a->top--;
 8     sec = a->data[a->top];
 9     a->top--;
10     topchar = b->data[b->top];    //b的栈顶出栈
11     b->top--;
12     resultval = yunsuan(sec,fir,topchar);
13     a->top++;
14     a->data[a->top] = resultval;
15     return(resultval);
16 }

全部代码如下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 
  5 #define MAXSIZE 1024
  6 
  7 //定义存储整型的栈
  8 typedef struct node
  9 {
 10     int data[MAXSIZE];
 11     int top;
 12 }SeqStack;
 13 //定义存储字符型的栈
 14 typedef struct nodeb
 15 {
 16     char data[MAXSIZE];
 17     int top;
 18 }SeqStackchar;
 19 
 20 //创建整型栈
 21 SeqStack *creat_sa()
 22 {
 23     SeqStack *s;
 24     s = (SeqStack *)malloc(sizeof(SeqStack));
 25     s->top = -1;
 26     return(s);
 27 }
 28 //创建字符串栈
 29 SeqStackchar *creat_sb()
 30 {
 31     SeqStackchar *s;
 32     s = (SeqStackchar *)malloc(sizeof(SeqStackchar));
 33     s->top = -1;
 34     return(s);
 35 }
 36 
 37 //函数声明
 38 int youxianquan(char c);
 39 int yunsuan(int a, int b, char c);
 40 int result(SeqStack *a, SeqStackchar *b);
 41 int abyunsuan(SeqStack *a, SeqStackchar *b);
 42 
 43 //获取优先级
 44 int youxianquan(char c)
 45 {
 46     int x;
 47     switch(c)
 48     {
 49         case '-':
 50         case '+':
 51             x = 1;
 52             break;
 53         case '*':
 54         case '/':
 55             x = 2;
 56             break;
 57         default: printf("error");
 58     }
 59     return(x);
 60 }
 61 
 62 //开始运算
 63 int yunsuan(int a, int b, char c)
 64 {
 65     int result;
 66     switch(c)
 67     {
 68         case '*':
 69             result = a * b;
 70             break;
 71         case '/':
 72             result = a / b;
 73             break;
 74         case '+':
 75             result = a + b;
 76             break;
 77         case '-':
 78             result = a - b;
 79             break;
 80     }
 81     return(result);
 82 }
 83 
 84 //a出栈两个值 b出栈栈顶运算符,进行运算
 85 int abyunsuan(SeqStack *a, SeqStackchar *b)
 86 {
 87     int fir,sec,resultval;
 88     char topchar;
 89     fir = a->data[a->top];
 90     a->top--;
 91     sec = a->data[a->top];
 92     a->top--;
 93     topchar = b->data[b->top];    //b的栈顶出栈
 94     b->top--;
 95     resultval = yunsuan(sec,fir,topchar);
 96     a->top++;
 97     a->data[a->top] = resultval;
 98     return(resultval);
 99 }
100 
101 //表达式求值
102 int result(SeqStack *a, SeqStackchar *b)
103 {
104     char val[9] = {'4','+','4','/','2','-','9','*','3'};        //创建表达式
105     int i,resultval;
106     int x,y;
107     char c;
108     int n = sizeof(val);
109     for(i = 0; i < n; i++)
110     {
111         c = val[i];        //获取表达式第i个值
112         if(i%2 == 0)    //把数字和符号区分开来,
113         {
114             a->top++;
115             a->data[a->top] = c - '0';    //存放数值的
116         }
117         else        //存放符号的
118         {
119             if(b->top == -1)        //如果b为空则直接存入符号
120             {
121                 b->top++;
122                 b->data[b->top] = c;
123             }
124             else
125             {
126                 x = youxianquan(c);                //求出当前符号的优先级
127                 y = youxianquan(b->data[b->top]);    //求b栈顶的符号优先级
128                 if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
129                 {
130                     b->top++;
131                     b->data[b->top] = c;
132                 }
133                 else        
134                 {
135                     resultval = abyunsuan(a,b);        //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a;
136                     b->top++;
137                     b->data[b->top] = c;
138                 }
139             }
140         }
141         while(i == n - 1 && a->top != -1 && b->top != -1)        //当运算符输入完时 即当所有的字符全部输入完时才执行此循环
142         {
143             resultval = abyunsuan(a,b);
144         }
145     }

     //也可以把上面的一个while循环注释掉,然后加上下面的循环;
    /*
      while(a=>top != -1 && b->top != -1)
        resultval = abyunsuan(a,b);
    */
146 return resultval; 147 } 148 149 void main() 150 { 151 SeqStack *a; 152 SeqStackchar *b; 153 int resultval; 154 a = creat_sa(); //创建链表a 155 b = creat_sb(); //创建链表b 156 resultval = result(a,b); 157 printf("%d",resultval); 158 159 }
原文地址:https://www.cnblogs.com/ngnetboy/p/2706457.html