zoukankan      html  css  js  c++  java
  • 中缀式转后缀式

    任务描述

    本关任务:熟练掌握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 **********/
    }
  • 相关阅读:
    实现路由的RouterMiddleware中间件
    AI: Jarvis
    使用管道(PipeLine)和批量(Batch)操作
    OSWatcher Black Box
    NET Core HTTP 管道
    开源项目!
    Router的创建者——RouteBuilder
    .NET Core)的ZooKeeper异步客户端
    single-write-database-connection
    Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13917630.html
Copyright © 2011-2022 走看看