数据结构实验之栈与队列二:一般算术表达式转换成后缀式

来源:互联网 发布:使命召唤8mac版迅雷 编辑:程序博客网 时间:2024/06/06 04:52

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

Input

输入一个算术表达式,以‘#’字符作为结束标志。

Output

输出该表达式转换所得到的后缀式。

Example Input

a*b+(c-d/e)*f#

Example Output

ab*cde/-f*+










#include <iostream>
#include <stdlib.h>


using namespace std;


#define SIZE 100
#define ADDSIZE 10


struct S
{
int stacksize;
char *top,*base;
};


void Inistack(S &s)
{
s.base=new char[SIZE];
s.top=s.base;
s.stacksize=SIZE;
}


void Push(S &s,char e)
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base=(char *)realloc(s.base,(s.stacksize+ADDSIZE)*sizeof(char));
    }
*s.top++=e;
}


char Pop(S &s)
{
return *--s.top;
}


int IsEmpty(S &s)
{
if(s.base==s.top)
{
return 1;
}
else
{
return 0;
}
}


char Gettop(S &s)
{
return *(s.top-1);
}


int Com(char c)
{
    int flag;
    if(c == '+'|| c == '-')
        flag = 1;
    else if(c == '*'|| c == '/')
        flag = 2;
    else if(c == '(')
        flag = 3;
    else if(c == ')')
        flag = 4;
    return flag;
}


int main()
{
    S s;
    Inistack(s);
while(true)
{
        char c;
        cin>>c;
        if(c=='#')
        {
            while(!IsEmpty(s))
            {
                cout<<Pop(s);
            }
            cout<<endl;
            break;
        }
        else if(c>='a'&&c<='z')
        {
            cout<<c;
        }
        else
        {   //进栈的要当最大的
            if(IsEmpty(s))
            {
                Push(s,c);
            }
            else if(Com(c)>Com(Gettop(s)))
            {
                if(c==')')//大的都能进,只有右括号不能进,遇到右括号把括号内的都释放
                {
                    while(Gettop(s)!='(')
                    {
                        cout<<Pop(s);
                    }
                    Pop(s);//去掉左括号
                }
                else
                {
                    Push(s,c);
                }
            }
            else
            {
                if(Gettop(s) != '(')
                {
                    cout<<Pop(s);
                    Push(s, c);
                }
                else//只有左括号不用输出
                {
                    Push(s, c);
                }
            }
        }
}
return 0;
}
/*后缀表达式用栈储存运算符的规则:1.若运算符优先级大于前一个则入栈2.若低于则将栈顶拿出后入栈3.左括号起与之前的运算符隔离的作用,右括号遇到后,将左括号以上依次拿出



阅读全文
0 0
原创粉丝点击