c++简单实现中缀表达式转后缀

中缀表达式转后缀表达式算法


使用栈进行辅助
对于符号±/(),定义为/优先级为2,’(’(左括号)优先级为3,右括号’)'优先级最低为0

对于一个表达式

如果当前字符为数字:
    输出到输出队列中;
否则当前字符是运算符号或者括号时候:
    while 当前优先级大于栈顶优先级并且栈不空:
         栈顶元素出栈加入到输出队列中;
    将元素压入栈内;
 while 当前栈非空:
     出栈返回栈顶元素;

对于左右括号问题

把左括号定义为 压入前是最高的优先级 压入后是最低优先级
这样一旦遇到左括号一定能被压入,并且压入后等级是最低的
定义右括号为第二低低的优先级 这样它就可以 一直pop栈元素
然后等遇到左括号 (左括号这个时候是最低的优先级)的时候
pop左括号


源码

#include 
#include 
#include 
#include 
using namespace std;
int main(int argc, char const *argv[])
{
    map<char, int> ss;
    ss['+'] = 1;
    ss['-'] = 1;
    ss['*'] = 2;
    ss['/'] = 2;
    stack<char> s;
    string express;
    while (cin >> express)
    {
        for (int i = 0; i < express.length(); i++)
        {
            if (isalpha(express[i]))
            {
                cout << express[i] << " ";
            }
            else if (express[i] == '(')
            {
                s.push(express[i]);
            }
            else if (express[i] == ')')
            {
                while (s.top() != '(')
                {
                    cout << s.top() << " ";
                    s.pop();
                }
                s.pop();
            }
            //*/优先级高因此栈的栈顶是优先级高的
            else
            {
                //cout << express[i];
                // 当前栈顶的元素优先级大于当前零时字符
                while (!s.empty() && ss[s.top()] >= ss[express[i]])
                {
                    cout << s.top() << " ";
                    s.pop();
                }

                s.push(express[i]);
            }
        }
        while (!s.empty())
        {
            cout << s.top() << " ";
            s.pop();
        }
        cout << endl;
    }
    system("pause");

    return 0;
}


运行结果

c++简单实现中缀表达式转后缀_第1张图片


2018年11月13日更新:
实现中缀转后缀并且计算,用cpp类描述:

#include 
#include 
#include 
using namespace std;

//规定最大的大小
const int MaxElement = 16;

typedef char ElementType;
// typedef class mystack *Stack;
class mystack
{
  private:
    const int EmptyTOS = -1;
    //允许的最小栈的大小
    const int MinStackSize = 5;
    int Capacity;
    int TopOfStack;
    ElementType *Array;

  public:
    void PrintStack()
    {
        if (TopOfStack == EmptyTOS)
        {
            cout << "empty!\n";
            return;
        }
        for (int i = TopOfStack; i != EmptyTOS; i--)
        {
            printf("\t\t%d\n", Array[i]);
        }
    }
    //判断是否为空栈
    int isEmpty()
    {
        return TopOfStack == EmptyTOS;
    }

    //判断是否满栈
    int isFull()
    {
        return TopOfStack == MaxElement;
    }
    //建栈
    mystack()
    {

        if (MaxElement < MinStackSize)
        {
            printf("stack size is too small.\n");
            exit(1);
        }
        Array = new ElementType[MaxElement];
        Capacity = MaxElement;
        MakeEmpty();
    }

    //销毁栈
    ~mystack()
    {
        delete[] Array;
    }

    //清空一个栈
    //注意 有软删除和硬删除两种
    //这里是软删除
    //对于顺序存储只需要软删除即可达到硬删除的效果
    void MakeEmpty()
    {
        TopOfStack = EmptyTOS;
    }

    //压栈
    void push(ElementType X)
    {
        if (isFull())
        {
            printf("stack is full.\n");
            exit(1);
        }
        else
        {
            Array[++TopOfStack] = X;
        }
    }

    //返回栈顶元素
    ElementType Top()
    {
        return Array[TopOfStack];
    }

    //弹出栈顶元素
    void Pop()
    {
        if (isEmpty())
        {
            printf("empty stack.\n");
            exit(1);
        }
        else
        {
            TopOfStack--;
        }
    }

    //返回栈顶元素并且pop操作
    ElementType TopAndPop()
    {
        if (isEmpty())
        {
            printf("empty stack.\n");
            exit(1);
        }
        else
        {
            return Array[TopOfStack--];
        }
    }
};

int main(int argc, char const *argv[])
{
    int ss[256] = {0};
    ss['+'] = 1;
    ss['-'] = 1;
    ss['*'] = 2;
    ss['/'] = 2;
    int ans = 0;
    class mystack s;
    class mystack s2;
    //stack s;
    string express;
    string res="";
    while (getline(cin, express))
    {
        if (express[0] == '#')
        {
            break;
        }
        for (int i = 0; i < express.length(); i++)
        {
            if (isspace(express[i]))
            {
                continue;
            }
            if ((express[i]) >= '0' && express[i] <= '9')
            {
                cout << express[i] << " ";
                res += express[i];
            }
            else if (express[i] == '(')
            {
                s.push(express[i]);
            }
            else if (express[i] == ')')
            {
                while (s.Top() != '(')
                {
                    cout << s.Top() << " ";
                    res += s.Top();
                    s.Pop();
                }
                s.Pop();
            }
            //*/优先级高因此栈的栈顶是优先级高的
            else
            {
                //cout << express[i];
                // 当前栈顶的元素优先级大于当前零时字符
                while (!s.isEmpty() && ss[s.Top()] >= ss[express[i]])
                {
                    cout << s.Top() << " ";
                    res += s.Top();
                    s.Pop();
                }
                s.push(express[i]);
            }
        }
        while (!s.isEmpty())
        {
            cout << s.Top() << " ";
            res += s.Top();
            s.Pop();
        }
        cout << endl;

        cout<<"res="<<res<<endl;
        for (int i = 0; i < res.length(); i++)
        {
            if ((res[i]) == '+' || res[i] == '-' || res[i] == '*' || res[i] == '/')
            {
                int temp = 0;
                int t1 = s2.Top() - '0';
                s2.Pop();
                int t2 = s2.Top() - '0';
                s2.Pop();
                switch (res[i])
                {
                case '+':
                    temp = t2 + t1;
                    break;
                case '-':
                    temp = t2 - t1;
                    break;
                case '*':
                    temp = t2 * t1;
                    break;

                case '/':
                    temp = t2 / t1;
                    break;
                }
                //printf("temp=%d\n",temp);
                temp = temp + '0';
                s2.push((char)temp);
            }
            else if ((res[i]) >= '0' && res[i] <= '9')
            {
                s2.push(res[i]);
            }
        }
        cout << s2.Top() - '0' << endl;
    }

    system("pause");
    return 0;
}

你可能感兴趣的:(读书笔记)