中缀式转后缀式

任务描述

本关任务:熟练掌握STL模板库中栈stack的基本操作,并利用栈实现中缀表达式转化为后缀表达式。

相关知识

中缀表达式转后缀表达式算法:。 (1) 初始化一个字符栈S和一个字符队列Q(存最终的后缀表达式) (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,加入队列Q; (4) 遇到括号时: (4-1) 如果是左括号(,则直接压入S; (4-2) 如果是右括号),则依次弹出S栈顶的运算符,加入队列Q,直到遇到左括号为止,此时将这一对括号丢弃; (5) 遇到运算符时,比较其与S栈顶运算符的优先级: (5-1) 如果S为空,或栈顶运算符为左括号(,则直接将此运算符入栈; (5-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S (5-3) 否则,将S栈顶的运算符弹出并入队列Q中,再次转到(4-1)与S中新的栈顶运算符相比较; (6) 重复步骤(2)至(5),直到表达式的最右边; (7) 将栈S中剩余的运算符依次弹出并加入队列S; (8) 依次输出队列Q中的元素并输出,即为后缀表达式。 例如,将中缀表达式2*(1+3)-4转换为后缀表达式2 1 3 + * 4 - 的过程如下: 栈的变化过程 有括号中缀表达式转换后缀表达式

编程要求

本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下:

读取中缀表达式,并基于栈的插入、删除等基本操作实现中缀表达式转化为后缀表达式。 说明: (1)表达式中所有的操作数为单一的数字:0~9; (2)运算符仅包含:+ - * /( ),其中“-”仅为减号,非负号; (3)表达式符号串的长度不超过100。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:1+((2+3)*4)-5 预期输出:123+4*+5-

输入格式:中缀表达式 输出格式:后缀表达式,末尾换行

#include<iostream>
#include<stack>
#include<queue>
#include<string.h>
using namespace std;
void intopost(char inexp[], char postexp[]);//把中缀表达式inexp,转换为后缀表达式postexp
int getPriority(char left, char right);//优先级比较(注意当运算符较多,优先级等级较多时,可以使用优先级表,并进行查表的方式进行比较)
int isNum(char ch);//判断是否为数字字符

stack<char>s1;
stack<char>s2;

int f(const char str){
    int yxj;
    switch(str){
        case '*':yxj=5;break;
        case '/':yxj=5;break;
        case '+':yxj=4;break;
        case '-':yxj=4;break;
    }
    return yxj;
}

int main() {
    char c[100], postexp[100];
    cin >> c;
    //intopost(inexp, postexp);  //转换中缀表达式为后缀表达式
    //cout << postexp<<endl;
    int lenc=strlen(c);
    for(int i=0;i<lenc;i++){
        if(c[i]>='0'&&c[i]<='9'){
            s2.push(c[i]);
        }else if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'){
            while(1){
                if(s1.empty()||s1.top()=='('){
                    s1.push(c[i]);
                    break;
                }
            
                else if(f(c[i])>f(s1.top())){
                    s1.push(c[i]);
                    break;
                }
                else{
                    char cc=s1.top();
                    s1.pop();
                    s2.push(cc);
                }
            }
        }
        else{
            if(c[i]=='('){
                s1.push(c[i]);
            }else{
                while(s1.top()!='('){
                    char ccc=s1.top();
                    s1.pop();
                    s2.push(ccc);
                }
                s1.pop();
            }
        }
    }
    while(!s1.empty()){
        char cccc=s1.top();
        s2.push(cccc);
        s1.pop();

    }
    while(!s2.empty()){
        char c=s2.top();
        s1.push(c);
        s2.pop();
    }
    while(!s1.empty()){
        cout<<s1.top();
        s1.pop();
    }
    return 0;
}



void intopost(char inexp[], char postexp[]) {
      // 请在这里补充代码,完成本关任务
    /********** Begin *********/
  
    
    /********** End **********/
}

int isNum(char ch)
{
      // 请在这里补充代码,完成本关任务
    /********** Begin *********/

   
    /********** End **********/
}

//优先级比较(注意当运算符较多,优先级等级较多时,可以使用优先级表,并进行查表的方式进行比较)
int getPriority(char left, char right)  
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
 
    
    /********** End **********/
}
原文地址:https://www.cnblogs.com/xxxsans/p/13917630.html