1003. 中缀表达式转后缀表达式

来源:互联网 发布:windows激活密钥 编辑:程序博客网 时间:2024/06/17 04:52
1003. 中缀表达式转后缀表达式
  
Total:466Accepted:89
    
    
Time Limit: 1sec    Memory Limit:256MB
Description
将中缀表达式(infix expression)转换为后缀表达式(postfix expression)。假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含双目算术操作符+-*/%
Input
表示中缀表达式的一个字符串(其中只包含操作数和操作符,不包含任何其他字符)
Output
表示对应后缀表达式的一个字符串(其中只包含操作数和操作符,不包含任何其他字符)
Sample Input
 Copy sample input to clipboard
A+B*C-D-E/F
Sample Output
ABC*+D-EF/-

Problem Source: demo test





#include <iostream>#include <string>#include <stack>using namespace std;bool isoper(char a) {    if(a =='+'||a =='-'||a =='*'||a =='/'||a =='%')        return true;    else return false;}int rank(char a) {    if(a =='*'||a =='/'||a =='%')        return 3;    else return 1;}int main() {    stack<char> op;    string str;    cin >> str;    int l = str.length();    for(int i = 0; i < l; i++) {        if(!isoper(str[i])) {        cout << str[i];} else {            if(op.empty()) {            op.push(str[i]);} else {                while(!op.empty()&&rank(op.top()) >= rank(str[i])) {                    cout << op.top();                    op.pop();                }                op.push(str[i]);            }        }    }    while(!op.empty()) {        cout << op.top();        op.pop();    }}

基本算法,利用栈:
中缀表达式转后缀表达式的算法较为简单,采用栈来实现。规则如下:
<span style="font-family:Microsoft YaHei;font-size:18px;">遇到数字:直接输出遇到'(':压栈遇到')':持续出栈,如果出栈的符号不是'('则输出,否则终止出栈。遇到符号则判断该符号与栈顶符号的运算优先级,如果栈顶符号的运算优先级高,则出栈并输出,直到优先级相等或栈为空;如果栈顶符号的运算优先级低于当前符号的运算优先级,则将当前符号压栈。处理完字符串后将栈中剩余的符号全部输出。</span>

0 0