中缀表达式转后缀

将中缀表达式转化成对应的后缀表达式

所谓后缀表达式是指这样的一个表达式:

        式中不再引用括号,运算符号放在两个运算对象之后,所有计 算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)

例1:中缀表达式: 3(5–2)+7                  对应的后缀表达式为:352-7+

例2:中缀表达式: 2+48+(88+1)/3         对应的后缀表达式为 248+881+3/+

#include <iostream>
using namespace std;
#include <string>
struct Stack
{
    string str;
    int top;
};
void initstack(struct Stack &s);
string ztoh(string str);
void pushstack(struct Stack &s,char a);
char popstack(struct Stack &s);
char gettop(struct Stack &s);
int main()
{
    string str;
    cout<<"请输入中缀表达式:>";
    while(cin>>str)
    {
        cout<<"对应的后缀表达式为:>"<<ztoh(str)<<endl;
        cout<<"请输入中缀表达式:>";
    }
    return 0;
}
string ztoh(string str)
{
    struct Stack s;
    initstack(s);
    string finalstr;
    for(int i=0;str[i]!='\0';i++)
    {
        switch(str[i])
        {
            case '(':	//直接入栈
                pushstack(s,str[i]);
                break;
            case ')':	
                char topElem,n;
                topElem=gettop(s);	//取栈顶判断
                while(topElem!='(')
                {
                    n=popstack(s);	//中间的出栈到后缀表达式
                    finalstr+=n;
                    if(s.top==-1)
                    {
                        break;
                    }
                    else
                        topElem=gettop(s);
                }
                popstack(s);	//左括号出栈
                break;
            case '+':
            case '-':
                char topElem1,x1;
                topElem1=gettop(s);	//取栈顶判断
                while(topElem1=='+'||topElem1=='-'||topElem1=='*'||topElem1=='/')
                {
                    x1=popstack(s);	//将符号(同级和高级)出栈到后缀表达式
                    finalstr+=x1;
                    if(s.top==-1)
                        break;
                    else
                        topElem1=gettop(s);
                }
                pushstack(s,str[i]);	//将符号 +/- 入栈
                break;
            case '*':
            case '/':
                char topElem2,x2;
                topElem2=gettop(s);	//去栈顶判断
                while(topElem2=='*'||topElem2=='/')	
                {
                    x2=popstack(s);	//将符号出栈到后缀表达式
                    finalstr+=x2;
                    if(s.top==-1)
                        break;
                    else
                        topElem2=gettop(s);
                }
                pushstack(s,str[i]);	//符号入栈
                break;
            default:
                finalstr+=str[i];	//将符号外的字符加到后缀表达式
                break;
        }
    }
    while(s.top!=-1)	//将栈中的符号加到后缀表达式上
    {
        char x3=popstack(s);
        finalstr+=x3;
    }
    return finalstr;
}
void initstack(struct Stack &s)	//栈初始化
{
    s.top=-1;
    return;
}
void pushstack(struct Stack &s,char a)	//入栈
{
    s.top++;
    s.str[s.top]=a;
    return;
}
char popstack(struct Stack &s)	//出栈
{
    if(s.top==-1)
        return '#';    //随便搞了个字符
    else
        return s.str[s.top--];
}
char gettop(struct Stack &s)	//读取栈顶元素
{
    if(s.top==-1)
        return '#';    //随便搞了个字符
    else
        return s.str[s.top];
}

参考链接    http://t.csdn.cn/yDWjr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值