码迷,mamicode.com
首页 > 其他好文 > 详细

利用栈将中缀表达式转为后缀表达式

时间:2020-03-15 13:39:09      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:com   运用   cas   顺序   while   pop   exit   处理   pre   

#include<iostream>
#include<stdio.h>
using namespace std;
#include<stack>
const int SM = 40;
int Precedence(char op){
    //返回运算符op所对应的优先级数值
    switch (op){
    case ‘+‘:
    case ‘-‘:return 1;//定义加减运算的优先级为1
    case ‘*‘:
    case ‘/‘:return 2;//定义乘除运算的优先级为2
    default:return 0;
    }
}
//将字符串s1中的中缀表达式转换为字符串s2中的后缀表达式
void Transfer(char s1[SM],char s2[SM]){
    stack<char> R;//定义运用暂存运算符的栈
    R.push(‘@‘);//栈底放入"@"字符,它具有最低优先级0
    int i, j;//用于指示扫描s1和s2中的字符串的位置
    i = 0;
    j = 0;
    char ch = s1[i];
    while (ch != ‘@‘){
        //顺序处理中缀表达式中的每个字符
        if (ch == ‘ ‘){
            ch = s1[++i];
        }//对于空格字符不做任何处理
        else if (ch == ‘(‘){
            R.push(ch);
            ch = s1[++i];
        }//当字符为左括号,直接进栈
        else if (ch == ‘)‘){
            while (R.top() != ‘(‘){
                s2[j++] = R.top();
                R.pop();
            }
            R.pop();//跳出while循环后,说明此时ch为左括号,继续左括号出栈,删除栈顶的左括号
            ch = s1[++i];
        }//当字符为右括号,使括号内的仍停留在栈中的运算符依次出栈并写入到s2中
        else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘){
            //对于四则运算符,使暂存在栈中的不低于ch优先级的运算符依次出栈并写入到s2中
            char w = R.top();
            while (Precedence(w) >= Precedence(ch)){
                //Precedence()函数返回运算符形参的优先级
                s2[j++] = w;
                R.pop();
                w = R.top();
            }
            R.push(ch);
            ch = s1[++i];
        }
        else{//此处必为数字或小数点符号
            while (isdigit(ch) || ch == ‘.‘){
                //把一个数值中的每一位依次写入到s2串中
                s2[j++] = ch;
                ch = s1[++i];
            }
            //被转换后的每个数值后放入一个空格
            s2[j++] = ‘ ‘;

        }
    }
        //把暂存在栈中的运算符依次出栈并写入到s2串中
        ch = R.top();
        R.pop();
        while (ch != ‘@‘){
            if (ch == ‘(‘){
                cerr << "expression error!" << endl;
                exit(1);
            }
            else(s2[j++] = ch);
            ch = R.top();
            R.pop();
        }
        s2[j++] = ‘@‘;
        s2[j++] = ‘\0‘;



}
void main(){
    char p1[40];
    char p2[40];
    cout << "输入中缀表达式:";
    cin >> p1;
    Transfer(p1, p2);
    cout << "输出后缀表达式为:" << p2 << endl;
    getchar();
}

技术图片

 

利用栈将中缀表达式转为后缀表达式

标签:com   运用   cas   顺序   while   pop   exit   处理   pre   

原文地址:https://www.cnblogs.com/pesuedream/p/12496801.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!