1368 表达式转换
来源:互联网 发布:wifi提示无法加入网络 编辑:程序博客网 时间:2024/04/29 22:53
把中缀表达式转化为后缀表达式……
书上有详细讲解.
- 输入
第一行为T,表示有T组数据;
以下T行每行包含一个字符串,是中缀表达式。
- 输出
对于每组测试数据数据后缀表达式。
- 样例输入
1
A+(B-C/D)*E
- 样例输出
ABCD/-E*+
经典问题,用栈实现
#include <iostream> #include <string> #include <stack> using namespace std; void Convert(const string & Infix, string & Postfix); bool IsOperand(char ch); bool TakesPrecedence(char OperatorA, char OperatorB); int main(void) { char Reply; int number; scanf("%d",&number); while(number--) { string Infix, Postfix; // local to this loop cin >> Infix; Convert(Infix, Postfix); cout << Postfix << endl; } return 0; } /* Given: ch A character. Task: To determine whether ch represents an operand (here understood to be a single letter or digit). Return: In the function name: true, if ch is an operand, false otherwise. */ bool IsOperand(char ch) { if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9'))) return true; else return false; } /* Given: OperatorA A character representing an operator or parenthesis. OperatorB A character representing an operator or parenthesis. Task: To determine whether OperatorA takes precedence over OperatorB. Return: In the function name: true, if OperatorA takes precedence over OperatorB. */ bool TakesPrecedence(char OperatorA, char OperatorB) { if (OperatorA == '(') return false; else if (OperatorB == '(') return false; else if (OperatorB == ')') return true; else if ((OperatorA == '^') && (OperatorB == '^')) return false; else if (OperatorA == '^') return true; else if (OperatorB == '^') return false; else if ((OperatorA == '*') || (OperatorA == '/')) return true; else if ((OperatorB == '*') || (OperatorB == '/')) return false; else return true; } /* Given: Infix A string representing an infix expression (no spaces). Task: To find the postfix equivalent of this expression. Return: Postfix A string holding this postfix equivalent. */ void Convert(const string & Infix, string & Postfix) { stack<char> OperatorStack; char TopSymbol, Symbol; int k; for (k = 0; k < Infix.size(); k++) { Symbol = Infix[k]; if (IsOperand(Symbol)) Postfix = Postfix + Symbol; else { while ((! OperatorStack.empty()) && (TakesPrecedence(OperatorStack.top(), Symbol))) { TopSymbol = OperatorStack.top(); OperatorStack.pop(); Postfix = Postfix + TopSymbol; } if ((! OperatorStack.empty()) && (Symbol == ')')) OperatorStack.pop(); // discard matching ( else OperatorStack.push(Symbol); } } while (! OperatorStack.empty()) { TopSymbol = OperatorStack.top(); OperatorStack.pop(); Postfix = Postfix + TopSymbol; } }
- 1368 表达式转换
- 表达式转换
- 表达式转换
- 后缀表达式转换表达式树
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式转换后缀表达式
- 中缀表达式 前缀表达式 后缀表达式 转换
- 转换为表达式
- 字符串转换为表达式
- c++表达式--类型转换
- 正则表达式转换
- 表达式 中缀 后缀 转换
- 表达式类型的转换
- 正则表达式转换
- 在class文件中读取Tomcat站点的根目录
- GBK UTF8 编码转换
- 【转】 J2EE应用高性能构建技巧_性能瓶颈
- 解决Netbeans 下 undefined reference to `pthread_create'
- GPIO口的设置
- 1368 表达式转换
- linux各文件夹的作用(转)
- linux shell 字符串操作(长度,查找,替换)详解
- zoj3516和树相关
- 数字图像基本处理算法
- bupt 204 Palindrome
- sqlite 自动编号的实现
- 1369 窗口超级版
- 什么是InnoDB