中缀表达式转后缀表达式及求值

中缀->后缀

#include <iostream>
using namespace std;
//实现中缀表达式转化为后缀表达式
//算法
// 输入:合法的后缀表达式
  /*
    逐个读取输入字符,若是操作数则直接输出
    若是运算符,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶运算符,则栈顶元素依次出栈并输出,并将当前符号进栈
    一直到最终输出后缀表达式为止
  */
#define MAXSIZE 20;
bool comparePriority(char c1, char c2) {
    //c1代表栈顶操作符 c2代表输入运算符
    //可用的运算符有
    /*
        + - * / ( )
        优先级:(=)>*=/>+=-

        (括号优先级是最高的
        
        遇到右括号则一直出栈到左括号
        
    */
    if (c2 == '(') {
        return true;
    }
    else if(c2==')')
    {
        return false;
    }
    else if ((c2 == '+' || c2 == '-')&&(c1=='+'||c1=='-')) 
    {
        return false;
    }
    else if ((c2 == '+' || c2 == '-') && (c1 == '*' || c1 == '/'))
    {
        return false;
    }
    else if((c2=='*'||c2=='/') && (c1=='+'||c1=='-'))
    {
        return true;
    }
    else if((c2 == '*' || c2 == '/') && (c1 == '*' || c1 == '/'))
    {
        return false;
    }
    else if (c1 == '#') {
        return true;
    }
    else if(c2=='#')
    {
        return false;
    }
}
int main()
{
    //定义操作符栈
    char op[20];
    string input;
    std::cout << "请输入合法的中缀表达式:" << endl;
    cin >> input;
    //
    //定义符号栈的指针,指向栈顶,初始化为-1
    int top=-1; 
    //#号入栈
    op[++top] = '#';
    for (int i = 0; i < input.length(); i++) {
        if (input[i] >= '0' && input[i] <= '9') {  //代表是数字
            //直接输出
            std::cout << input[i];
        }
        else //是操作符
        {
            //比较该操作符和栈顶符号的优先级
            /*
                1.若是当前读取的运算符比栈顶运算符优先级高,则入栈,否则栈顶的运算符依次出栈
                
            */
            if (comparePriority(op[top],input[i])) {
                //栈顶操作符的优先级比输入运算符的优先级低
                //运算符入栈
                op[++top] = input[i];
            }
            else if(input[i]==')')
            {
                //出栈直到遇到左括号
                while (op[top] != '(') {
                    std::cout << op[top--];
                }
                //左括号也出栈
                op[top--];
            }
            else //栈顶操作符的优先级比输入运算符的优先级高
            {
                //出栈直到遇到比输入运算符优先级低的
                while (!comparePriority(op[top], input[i])) {
                    std::cout << op[top--];
                }
            }
        }
    }
}

求值后缀

#include<iostream>
using namespace std;

/*
	后缀表达式求值
	输入:后缀表达式
	从左至右依次扫描
	若是操作数则入栈
	若是运算符则将操作数栈的前两个数弹出进行运算,注意顺序,将结果压入操作数栈
*/
int main() 
{
	cout << "请输入合法的后缀表达式" << endl;
	string exp = NULL;
	//操作数栈
	int num[20];  //用int类型
	int top = -1; //栈顶指针为-1
	cin >> exp;   //输入表达式
	for (int i = 0; i < exp.length(); i++) 
	{
		if (exp[i] >= '0' && exp[i] <= '9')
		{
			//入栈 把char转int
			num[++top] = exp[i]-'0';
		}
		else
		{
			//是运算符
			int num1 = num[top--];
			int num2 = num[top--];
			int result;
			if (exp[i] == '+')
			{
				result = num2 + num1;
			}
			else if(exp[i] == '-')
			{
				result = num2 - num1;
			}
			else if (exp[i] == '*')
			{
				result = num2 * num1;
			}
			else if (exp[i] == '/')
			{
				result = num2 / num1;
			}

			//将运算结果入栈
			num[++top] = result;
		}
	}

	cout << "运算结果是:" << num[0]<<endl;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值