中缀转后缀(逆波兰式求值)

(1) 0-2^32 位 之间 ,  考虑数字大于10的情况.

(2) C/C++实现

(3) 中缀转后缀调用 栈stack 

(4) 后缀求值,用自己定义的栈求值

思路:

初始化两个栈:运算符栈s1和储存中间结果的栈s2;
    从左至右扫描中缀表达式;
    遇到操作数时,将其压s2;
    遇到运算符时,比较其与s1栈顶运算符的优先级:
    如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
    否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
    否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
    遇到括号时:
    如果是左括号“(”,则直接压入s1;
    如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
    重复步骤2至5,直到表达式的最右边;
    将s1中剩余的运算符依次弹出并压入s2;
    依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)

实现:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef struct sstack{
    int top;
    int *data;
    int MaxSize;
    void InitStack(int sz){
        MaxSize = sz;
        data = new int[sizeof(int)*MaxSize];
        top = -1;
    }
    void FreeStack(){
        free(data);
    }
    void MakeEmpty(){
        top = -1;
    }
    bool IsEmpty(){
        return top ==-1;
    }
    bool IsFull(){
        return top == MaxSize-1;
    }
    int Push(int item){
        if(!IsFull()){
            data[++(top)] = item;
            return 0;
        }
        return -1;
    }
    int Pop(){
        if(!IsEmpty()){
            return data[(top) --];
        }
        return -1;
    }
    int GetTop(){
        if(!IsEmpty()){
            return data[top];
        }
        return -1;
    }
}Stack;

string zh_str =  "(2*(3+4)+5)*6-6/3";
string af_str ="";
int fir[128];
void init()
{
    fir['+']=fir['-'] = 1;
    fir['*']=fir['/'] = 2;
}
void Work1()
{
    stack<char>S1;

    int len = zh_str.length();
    int cot = 0 ;
    for(int i = 0 ; i < len ; i++)
    {
        if(zh_str[i]==' ')
            continue;
        if(zh_str[i]>='0' && zh_str[i]<='9')
        {
            int tempnum = 0 ;
            while(zh_str[i]>='0' && zh_str[i]<='9'){
                tempnum = tempnum*10 + (zh_str[i++]-'0');
            }
            i--;
            af_str += tempnum +'0';
            af_str +=' ' ;
        }
        else if(zh_str[i]=='(')  // 左括号直接进栈
        {
            S1.push(zh_str[i]);
        }
        else if(zh_str[i]==')') // 遇到右括号  依次出栈 直到碰到 (
        {
            while(S1.top()!='(' && !S1.empty())
            {
                af_str += S1.top();
                af_str +=' ' ;
                S1.pop();
            }
            S1.pop();// "(" 出栈
        }
        else // 处理  符号优先级的问题
        {
            if(S1.empty())
            {
                S1.push(zh_str[i]);
            }
            else{
               while(!S1.empty() && S1.top()!='(' && fir[S1.top()] >= fir[zh_str[i]] )
                {
                    af_str += S1.top();
                    af_str +=' ' ;
                    S1.pop();
                }
                S1.push(zh_str[i]);
            }
        }
    }
    while(!S1.empty()){  // 栈中所有元素出栈
        af_str += S1.top();
        af_str +=' ' ;
        S1.pop();
    }
    cout<<"after polish : "<<endl;
    cout<<af_str<<endl;
}
void Work2()
{
    Stack SK;// 自定义栈;
    SK.InitStack(100);
    int len = af_str.length();
    for(int i = 0 ; i < len ; i++)
    {
        if(af_str[i] == ' ')
            continue;
        if(af_str[i]>='0' && af_str[i]<='9')
        {
            int tempnum = 0 ;
            while(af_str[i]>='0' && af_str[i]<='9'){
                tempnum = tempnum*10 + (af_str[i++]-'0');
            }
            i--;
            SK.Push(tempnum);
        }
        else{
            int k ;
            switch(af_str[i]){
                case '+':
                    k = SK.Pop() + SK.Pop();
                    SK.Push(k);
                    break;
                case '-':
                    k = SK.Pop();
                    k = SK.Pop() - k;
                    SK.Push(k);
                    break;
                case '*':
                    k = SK.Pop() * SK.Pop();
                    SK.Push(k);
                    break;
                case '/':
                    k = SK.Pop();
                    k = SK.Pop() / k;
                    SK.Push(k);
                    break;
            }
        }

    }
    cout<<"the ans is : "<<SK.Pop()<<endl;
}
int main()
{
    init();
    Work1();
    Work2();
    return 0;
}
发布了372 篇原创文章 · 获赞 89 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/sizaif/article/details/100561062