中缀表达式转后缀表达式 (栈)

Posted willendless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转后缀表达式 (栈)相关的知识,希望对你有一定的参考价值。

【题目链接】

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1356

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int dict[128];
 4 int i,tot,a,b;
 5 char s[110],ss[110];
 6 stack<char> rec;
 7 stack<int> tmp;
 8 int main()
 9 {
10     dict[+]=dict[-]=1;
11     dict[*]=dict[/]=2;
12     dict[^]=3;
13     scanf("%s",s+1);
14     for(i=1;s[i]!=;i++) {
15         if(isdigit(s[i])) { while(isdigit(s[i])) ss[++tot]=s[i++]; i--; ss[++tot]= ; }
16         else switch(s[i]) {
17             case (: rec.push((); break;
18             case ): while(rec.top()!=() ss[++tot]=rec.top(), rec.pop(); rec.pop(); break;
19             default:
20                 while(rec.size()&&dict[rec.top()]>=dict[s[i]]) ss[++tot]=rec.top(), rec.pop(); rec.push(s[i]);
21         }
22 
23     }
24     while(rec.size()) ss[++tot]=rec.top(),rec.pop();
25     for(i=1;i<=tot;i++)
26         if(isdigit(ss[i])) {
27             int cur=0;
28             while(isdigit(ss[i])) cur=cur*10+ss[i++]-0;
29             tmp.push(cur);
30         }
31         else{
32             int k=1;
33             a=tmp.top();tmp.pop();
34             b=tmp.top();tmp.pop();
35             switch(ss[i]) {
36                 case +: tmp.push(a+b); break;
37                 case -: tmp.push(b-a); break;
38                 case *: tmp.push(a*b); break;
39                 case /: tmp.push(b/a); break;
40                 case ^: for(int j=1;j<=a;j++) k*=b; tmp.push(k); break;
41             }
42         }
43     printf("%d
",tmp.top());
44     return 0;
45 }

 

以上是关于中缀表达式转后缀表达式 (栈)的主要内容,如果未能解决你的问题,请参考以下文章

《C#零基础入门之百识百例》(八十五)系统类Stack栈解析 -- 简单中缀表达式转后缀表达式

《C#零基础入门之百识百例》(八十五)系统类Stack栈解析 -- 简单中缀表达式转后缀表达式

中缀表达式如何转换为前后缀表达式?

数据结构-栈中缀表达式转后缀表达式

中缀表达式转后缀表达式

java简易计算机(用栈实现中缀转后缀,计算后缀表达式)