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

中缀表达式转后缀表达式

时间:2016-07-09 12:01:07      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。

pat:表达式转换(25)

 1 #include<stdio.h>
 2 #include<stack>
 3 #include<ctype.h>
 4 using namespace std;
 5 int p[300];
 6 int Priority(char a,char b){//判断优先级 
 7     if(a==()return 0;
 8     if(p[a]<p[b])return 0;
 9     if(p[a]>=p[b])return 1;
10 }
11 int main(){
12     char s[30],ans[60],tmp[60];
13     int i;
14     stack<char> st;//栈,用来存运算符 
15     p[+]=p[-]=1;//设置优先级 
16     p[*]=p[/]=2;
17     while(scanf("%s",s)!=EOF){
18         int j=0,k=0;//j:答案的指针;k:标记 
19         for(i=0;s[i];i++){
20             if(s[i]==()//左括号直接进栈 
21                 st.push(s[i]);
22             else if(s[i]==)){//将左括号后边的符号依次输出 
23                 if(k){
24                     ans[j++]= ;
25                     k=0;
26                 }
27                 while(st.top()!=(){
28                     ans[j++]=st.top();
29                     ans[j++]= ;
30                     st.pop();
31                 }
32                 st.pop();//删除左括号 
33             }
34             else if(s[i]>=0&&s[i]<=9||s[i]==.){//数字,包括小数 
35                 ans[j++]=s[i];
36                 k=1;
37             }
38             else{// +-*/ 
39                 if(k){//如果k==1,说明前面有数字,添加一个空格,并重置k 
40                     ans[j++]= ;
41                     k=0;
42                 }
43                 if((s[i]==+||s[i]==-)&&i==0){//正负号 1
44                     if(s[i]==-)
45                         ans[j++]=s[i];
46                     continue;
47                 }
48                 if((s[i]==+||s[i]==-)&&i!=0&&s[i-1]==(){//正负号 2 
49                     if(s[i]==-)    ans[j++]=s[i];
50                     st.pop();
51                     while(s[++i]!=)){//这里的右括号要特殊处理 
52                         ans[j++]=s[i];
53                     }
54                     ans[j++]= ;
55                     continue;
56                 }
57                 while(!st.empty()&&Priority(st.top(),s[i])){//弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 
58                     ans[j++]=st.top();
59                     ans[j++]= ;
60                     st.pop();
61                 }
62                 st.push(s[i]);
63             }
64         }
65         if(k){
66             ans[j++]= ;
67             k=0;
68         }
69         while(!st.empty()){//最后弹出所有运算符 
70             ans[j++]=st.top();
71             ans[j++]= ;
72             st.pop();
73         }
74         ans[j-1]=0;//将最后一个空格去掉 
75         puts(ans);
76     }
77     return 0;
78 } 

 

中缀表达式转后缀表达式

标签:

原文地址:http://www.cnblogs.com/L-King/p/5655332.html

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