中缀表达式转换前缀表达式(利用栈)

转换思路:

1、先对输入的字符串进行处理,分割字符串,划分优先级,将多位数的数字存入结构体看做整体,方便后续处理,为各个运算符划分优先级

2、创建两个栈,一个是结果栈,一个是运算符栈

3、从右至左扫描中缀表达式,如果是数字,就直接压入结果栈

若是运算符,则与运算符栈顶元素比较优先级:若该运算符优先级大于等于栈顶元素,则将该运算符入栈

否则栈内元素出栈并压入结果栈,再与其比较,直到该运算符优先级大于等于栈顶元素的优先级时,将该运算符压入栈中。

(注意:我们先在运算符栈中压入一个‘#’  规定其优先级为最低  这样解决了开始时候的边界问题)

(注意:特殊情况,如果遇到右括号直接压入栈中,如果遇到一个左括号,那么就将栈元素弹出并压入结果栈直到遇到左括号。停止弹出,这个过程,两个括号都不加入结果栈。)

4、最后,处理完了表达式,若运算符栈中还有元素,则将元素依次弹出并压入结果栈

5、将结果栈倒序输出。

代码实现:

//例:1-(2+3)  转换前缀是:- 1 + 2 3

//例:1+((2+3)*4)-5  转换前缀是:- + 1 * + 2 3 4 5
//例:123+((246+39)*48)-55 转换前缀是:- + 123 * + 246 39 48 55

#include
#include
#include
#include
using namespace std;
const int maxn=1005;
typedef struct NODE{
    string ch;
    int level;
}NODE;
NODE node[maxn];
string s;
int change(){
    int w1=0;
    for(int i=0;i='0'&&s[i]<='9'){ //分割字符串
            int j=i;
            while(s[j]>='0'&&s[j]<='9'){ j++;}
            node[w1].ch=s.substr(i,j-i);
            node[w1].level=100;
            w1++;
            i=j-1;
        }
    }
    return w1;
}
void solove(int l){
    NODE ans[maxn]; //结果栈
    NODE q[maxn];  //运算符栈
    int w2=0,w3=0;
    q[w3].ch="#";  q[w3++].level=-1;//先压入 #
    for(int i=l-1;i>=0;i--){
        if(node[i].level==100){
            ans[w2++]=node[i];
        }
        else{
            if(node[i].ch==")") q[w3++]=node[i];
            else if(node[i].ch=="("){
                while(q[w3-1].ch!=")"){
                    w3--; ans[w2++]=q[w3];//压入结果栈
                }
                w3--;
            }
            else{
                while(node[i].level=0;i--){//倒序输出
        cout<>s;        //输入表达式
    int l=change();//处理表达式
    solove(l);     //转换为前缀表达式
    return 0;
}

 

你可能感兴趣的:(刷题,数据结构(严蔚敏版))