中缀表达式转后缀表达式

中缀表达式

后缀表达式(逆波兰表示法)

 

中缀->后缀:借助辅助栈,遇到数字或字符直接打印,遇到符号与栈顶元素优先级比较,符号优先级高,则直接入栈。若当前符号优先级低,则依次出栈,直到栈顶元素比当前元素优先级低为止。

遇到“( ”无条件入栈,遇到“ )”将栈内元素依次出栈,知道出到左括号为止。

中缀->后缀:所有中缀表达式括起来,将符号拿到所在符号后面(对应的为栈顶元素大于等于当前元素时,弹出)

后缀->前缀:遇到数字或字符直接入栈,遇到符号将栈顶元素后一个与栈顶构成表达式。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include<vector>
#include <stack>
using namespace std;
int Priority(char a,char b)
{
    if((a == '*' || a == '/') )
       return 1;
    else return 0;
}
int main()
{
    stack<char> sta;
    char s[50];
    char ans[50];//装结果的数组

    while(scanf("%s",s) != EOF)
    {
        int i = 0;
        int j = 0;//控制答案数组的
        int k = 0;//是否输出空格
        for(i;s[i];i++)
        {
            if(s[i] == '(')//左括号直接压入
                sta.push(s[i]);
            else if(s[i] == ')')//右括号
            {
                if(k == 1)
                {
                    ans[j++] = ' ';
                    k = 0;
                }
                while(sta.top() != '(')//弹出栈中左括号之前的符号
                {
                    ans[j++] = sta.top();
                    ans[j++] = ' ';
                    sta.pop();
                }
                sta.pop();//弹出左括号
            }
             else if((s[i] >= '1' && s[i] <= '9') || s[i] == '.')
            {
                ans[j++] = s[i];
                k = 1;
            }
            else//符号位+-*/
            {
                if(k == 1)
                {
                    ans[j++] = ' ';
                    k = 0;
                }
                if((s[i] == '-' || s[i] == '+') && i == 0)//第一个是正负号
                {
                    if(s[i] == '-')
                        ans[j++] =  '-';
                }
                else if((s[i] == '-' || s[i] == '+') && i != 0 && s[i-1] == '(' )//有负数情况
                {
                    if(s[i] == '-')
                       ans[j++] = s[i] ;
                    sta.pop();//删除左括号
                    while(s[++i] != ')')
                    {
                        ans[j++] = s[i];
                    }
                    ans[j++] = ' ';
                }
                else
                {
                    //弹出所有优先级大于该运算符的栈顶元素,然后将该运算符入栈
                    while(!sta.empty() && Priority(sta.top(),s[i]) )
                    {
                        ans[j++] = sta.top();
                        ans[j++] = ' ';
                        sta.pop();
                    }
                    sta.push(s[i]);//优先级低,直接放入
                }
            }
        }
        if(k == 1)
        {
            ans[j++] = ' ';
            k = 0;
        }
        while(!sta.empty())//弹出栈中剩余元素
        {
            ans[j++] = sta.top();
            ans[j++] = ' ';
            sta.pop();
        }
        ans[j-1]=0;
        puts(ans);
    }
}

 

posted @ 2018-05-27 16:05  Lune-Qiu  阅读(648)  评论(0编辑  收藏  举报