中缀转后缀 栈

算术表达式中的简单算术表达式,由中缀转为后缀的方法:将中缀表达式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';
}



### 中缀表达式后缀表达式的操作 为了实现中缀后缀表达式的换,在C++中可以利用标准模板库中的`std::stack`容器。此过程涉及遍历输入字符串并根据不同字符类型执行特定动作。 对于运算符,比较其优先级与当前顶元素;如果顶元素具有更高或相等的优先级,则弹出该元素直到遇到更低优先级的操作符或者左括号为止[^3]。当处理完所有输入之后,任何剩余于内的运算符都应被依次弹出并加入输出队列之中。 下面是一个简单的C++程序用于演示这一算法: ```cpp #include <iostream> #include <string> #include <stack> using namespace std; // 函数用来判断给定字符是否为操作数 bool isOperand(char ch) { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); } // 返回指定运算符对应的权重值 int Prec(char ch) { switch(ch){ case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; } return -1; // 如果不是运算符则返回负数表示错误 } void infixToPostfix(string s) { stack<char> st; string result; for(int i = 0; i<s.length(); i++) { char c = s[i]; // 如果是操作数直接添加至结果串 if(isOperand(c)) { result += c; } // 遇见左括号压入中 else if(c == '(') { st.push('('); } // 右括号意味着要将最近的一组匹配括号间的所有运算符取出 else if(c == ')') { while(st.top() != '(') { result += st.top(); st.pop(); } st.pop(); } // 当前符号为运算符时 else{ while(!st.empty() && Prec(s[i]) <= Prec(st.top())) { result += st.top(); st.pop(); } st.push(c); } } // 将里剩下的全部加到结果后面去 while(!st.empty()) { result += st.top(); st.pop(); } cout << "后缀表达式:" << result << endl; } ``` 上述代码实现了基本功能,能够正确地把一个合法的中缀算术表达式化为相应的后缀形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值