前缀表达式详细解释以及代码展现

目录

1:前缀表达式解释

2:前缀表达式代码展现


1:前缀表达式解释

前缀表达式是什么呢?平时我们用的表达式是8+8-9=7这样子的表达式,这个叫中缀表达式,是我们平时所用的表达式,有中自然就有前和后了,但是这篇文章我们只讲前缀表达式滴。

前缀表达式我们的一般样子是: +  +  2   *   3  -  7  4  /  8   4

将它转换成中缀表达式为2+3*(7-4)+8/4

那么该如何转换呢,这里就要用到栈的知识(先进后出)

从右往左开始(你问我为什么,嘿嘿我也不知道)遇到数字4进栈,继续,遇到8进栈,继续,遇到了符号  /,这时候就要开始计算了,将栈顶元素8弹出,然后在弹出栈顶元素4,计算8/4=2,那么计算结果2进栈,现在栈内只有2了,继续,遇到4,进栈,栈中{4,2},继续,7进栈,栈中{7,4,2},继续,遇到符号-,取出栈顶元素7,弹出,再取一个栈顶元素4,在弹出,计算7-4=3,将计算结果3进栈,栈中{3,2},继续,3进栈,栈中{3,3,2},继续,遇到  *,还是弹出栈顶元素,然后再弹出一个栈顶元素,计算,3*3=9,将计算结果9进栈,栈中{9,2},继续,2进栈,栈中{2,9,2},继续,遇到 +,还是弹出栈顶元素,在弹出一个栈顶元素,进行计算,2+9=11,将计算结果11进栈,栈中{11,2},继续,遇到+,计算栈中仅存的2个元素了,11+2=13。

这就是前缀表达式的一个具体思路了,更细节的话还有什么括号啊,符号和数字数不匹配啊,无法形成中缀表达式计算等等就不讨论了,这里我主要是教会大家什么是前缀表达式,如何理解前缀表达式的。

2:前缀表达式代码展现

#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
	stack<int>q;
	getline(cin,s);
	int l=s.size();
	int f=0;
	for(int i=l-1;i>=0;i--){
		if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
			if(q.size()<2){
				f=1;
				break;
			}
			int sum;
			int n1=q.top();
			q.pop();
			int n2=q.top();
			q.pop();
			if(s[i]=='+')sum=n1+n2;
			else if(s[i]=='-')sum=n1-n2;
			else if(s[i]=='*')sum=n1*n2;
			else if(s[i]=='/'){
				if(n2==0){
					f=1;
					break;
				}
				else{
					sum=n1/n2;
				}
			}
			q.push(sum);
		}
		else if(s[i]==' ')continue;//空格进行下一次的循环
		else{
			//数
			int a=s[i]-'0';//从字符型转换成整型
			q.push(a);
		}
	}
	if(q.size()!=1)f=1;
	if(q.size()==1)cout<<q.top();
	if(f==1){
		cout<<"ERROR";
		return 0;
	}
	return 0;
}

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Qt实现中缀表达式前缀表达式代码: ```cpp #include <QStack> #include <QString> QString infixToPrefix(QString infix) { QStack<QChar> operators; QStack<QString> operands; for(int i = 0; i < infix.length(); i++) { QChar c = infix[i]; if(c == ' ' || c == '\t') { continue; } else if(c.isDigit() || c.isLetter()) { QString operand; while(i < infix.length() && (infix[i].isDigit() || infix[i].isLetter())) { operand.append(infix[i++]); } operands.push(operand); i--; } else if(c == ')') { operators.push(c); } else if(c == '(') { while(!operators.isEmpty() && operators.top() != ')') { QString rightOperand = operands.pop(); QString leftOperand = operands.pop(); QChar op = operators.pop(); QString expression = op + leftOperand + rightOperand; operands.push(expression); } operators.pop(); } else { while(!operators.isEmpty() && precedence(c) <= precedence(operators.top())) { QString rightOperand = operands.pop(); QString leftOperand = operands.pop(); QChar op = operators.pop(); QString expression = op + leftOperand + rightOperand; operands.push(expression); } operators.push(c); } } while(!operators.isEmpty()) { QString rightOperand = operands.pop(); QString leftOperand = operands.pop(); QChar op = operators.pop(); QString expression = op + leftOperand + rightOperand; operands.push(expression); } return operands.pop(); } int precedence(QChar op) { switch(op.toLatin1()) { case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; default: return 0; } } ``` 该代码使用两个栈来实现中缀表达式前缀表达式。`operators`栈用于存储运算符,`operands`栈用于存储操作数和子表达式。遍历中缀表达式时,如果当前字符是数字或字母,则将其解析为操作数并压入`operands`栈中;如果当前字符是右括号,则将其压入`operators`栈中;如果当前字符是左括号,则将`operators`栈中的运算符弹出,与`operands`栈中弹出的两个操作数构成一个子表达式,然后将该子表达式压入`operands`栈中,直到`operators`栈中弹出的运算符为左括号;如果当前字符是运算符,则将其与`operators`栈中的运算符比较,如果当前运算符的优先级小于等于`operators`栈顶运算符的优先级,则将`operators`栈中弹出的运算符与`operands`栈中弹出的两个操作数构成一个子表达式,然后将该子表达式压入`operands`栈中,直到`operators`栈为空或弹出的运算符的优先级大于当前运算符的优先级。最后,将`operands`栈中的元素合并成一个前缀表达式并返回。`precedence`函数用于获取运算符的优先级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜到极致就是渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值