首页 > 代码库 > 3-06. 表达式转换(25)(我只是来寻求帮助的,一直PE求案例)
3-06. 表达式转换(25)(我只是来寻求帮助的,一直PE求案例)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式说明:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式说明:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + |
2 | ((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / |
3 | 1314+25.5*12 | 1314 25.5 12 * + |
4 | -2*(+3) | -2 3 * |
5 | 123 | 123 |
一直格式错误,求路过大牛点拨指教啊!
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <stack> using namespace std; const int maxn = 520; stack <char>ss; char s[maxn]; int isnum(char c) { if((c>='0' && c<='9') || c=='.') return 1; return 0; } int val_op(char c) { if(c == '(' || c == ')') return 1; else if(c == '+' || c == '-') return 2; else if(c == '*' || c == '/') return 3; return 0; } int main() { scanf("%s",s); int len = strlen(s); int flag = 0, mark = 0; for(int i = 0; i < len; i++) { if(i == 0)//为了防止类似:-2*(+3)的案例 { if(s[i]=='-' || s[i] == '+') { printf("%c",s[0]); continue; } } //printf("size:%d",ss.size()); if(isnum(s[i]))//遇到运算数直接输出 { if(!flag) { flag = 1; printf("%c",s[i]); } else if(mark == 0)//为了防止类似:-2*(+3)的案例 printf("%c",s[i]); else { printf(" %c",s[i]); mark = 0; } continue; } if(s[i-1] == '(' && (s[i]=='+' || s[i]=='-')) { continue; } mark = 1;//为了防止类似:-2*(+3)的案例 if(s[i] == '(')//遇到左括号压入栈 { ss.push(s[i]); } else if(s[i] == ')')//遇到右括号把栈内的运算符输出知道遇到左括号 { while(ss.top()!='(') { printf(" %c",ss.top()); ss.pop(); } // printf(" d%cd ",ss.top()); ss.pop(); } else if(ss.size()) { if(val_op(s[i]) <= val_op(ss.top()))//如果遇到的运算符的优先级小于等于栈顶运算符 { while(ss.size()) { char tc = ss.top(); if(val_op(tc) < val_op(s[i]))//直到当前运算符的优先级大于栈顶运算符 { //ss.push(tc); break; } if(tc!='(' && tc != ')') printf(" %c",tc); ss.pop(); } } } if(s[i]!='(' && s[i]!=')') ss.push(s[i]); } if(ss.size())//输出栈内的运算符 { int len = ss.size(); for(int i = 0; i < len; i++) { if(ss.top()!='(' && ss.top()!=')') printf(" %c",ss.top()); ss.pop(); } } printf("\n"); return 0; } /* 2*(9+6/3-5)+4 -2*(+3) */
3-06. 表达式转换(25)(我只是来寻求帮助的,一直PE求案例)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。