中缀转后缀 栈

算术表达式中的简单算术表达式,由中缀转为后缀的方法:将中缀表达式exp转化为后缀表达式postexp的过程如下

while(从exp中读取字符ch,ch!=‘\0')

{

若ch是数字,将后继的数字均依次存放到postexp之中,并以字符“#”标志数值串结束;

若ch为左括号,将此括号进栈到op之中;

若ch为右括号,将op栈中的左括号之前的运算符全部依次退栈并放入postexp之中,将左括号删除;

若ch的运算符优先级不大于运算符栈op栈顶运算符(除栈顶运算符为“(”外)的优先级,则依次出栈并存入到postexp中,将ch进栈;

}

若字符串扫描完毕,则将运算符op中的所有运算符依次出栈并放入postexp中即可。

具体代码实现如下:

#include <iostream>
#include <stack>
using namespace std;

stack<char> op;

void trans(char exp[], char postexp[])
{
	char ch;
	int i = 0, j = 0;
	ch = exp[i]; i++;
	while (ch != '\0')
	{
		switch (ch)
		{
		case '(':
			op.push(ch);
			break;
		case ')':
			while (op.top() != '(')
			{
				postexp[j] = op.top(); j++;
				op.pop();
			}
			op.pop();
			break;
		case '+':
		case '-':
			while (!op.empty()&&op.top()!='(')
			{
				postexp[j] = op.top();
				j++;
				op.pop();
			}
			op.push(ch);
			break;
		case '*':
		case '/':
			while (!op.empty() && op.top() != '(' && (op.top() == '*' || op.top() == '/'))
			{
				postexp[j] = op.top();
				j++;
				op.pop();
			}
			op.push(ch);
			break;
		case ' ':
			break;
		default:
			while (ch >= '0'&&ch <= '9')
			{
				postexp[j] = ch;
				j++;
			}
			i--;
			postexp[j] = '#'; j++;

		}
		ch = exp[i]; i++;
	}
	while (!op.empty())
	{
		postexp[j] = op.top();
		j++;
		op.pop();
	}
	postexp[j] = '\0';
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式后缀表达式是一种常见的算法问题。下面是一种实现思路和代码实现总结: 1. 中缀表达式后缀表达式的实现思路: - 创建一个空和一个空列表,用于存储运算符和换后的后缀表达式。 - 如果遇到左括号,将其压入中。 - 如果遇到右括号,将中的运算符弹出并添加到后缀表达式列表中,直到遇到左括号为止。 - 如果遇到运算符,将其与顶的运算符进行比较: - 如果为空或顶为左括号,直接将运算符压入中。 - 如果顶的运算符优先级低于当前运算符,将当前运算符压入中。 - 如果顶的运算符优先级高于或等于当前运算符,将顶的运算符弹出并添加到后缀表达式列表中,然后将当前运算符压入中。 - 遍历完中缀表达式后,将中剩余的运算符依次弹出并添加到后缀表达式列表中。 2. 中缀表达式后缀表达式的代码实现总结: ```python def infix_to_postfix(expression): precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} stack = [] postfix = [] for char in expression: if char.isalnum(): postfix.append(char) elif char == '(': stack.append(char) elif char == ')': while stack and stack[-1] != '(': postfix.append(stack.pop()) stack.pop() else: while stack and precedence[char] <= precedence.get(stack[-1], 0): postfix.append(stack.pop()) stack.append(char) while stack: postfix.append(stack.pop()) return ''.join(postfix) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值