后缀表达式

本文介绍了后缀表达式(逆波兰式)的概念,它是一种不含括号且运算符位于运算对象之后的表达式形式。与常见的中缀表达式(运算符在操作数中间)不同,后缀表达式遵循从左到右的计算顺序。文章还讨论了如何将中缀表达式转换为后缀表达式的方法,包括使用栈来判断符号优先级,并给出了具体的操作步骤和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后缀表达式:后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。(抄自百度百科)
说到后缀表达式就不得不说中缀表达式了,中缀表达式就是我们最常见的表达式即运算符在两个操作数中间,运算优先级由运算符(包括括号)来决定,例如7+3*(8+1)-4/2.
在来讲一下中缀表达式转后缀表达式的方法:
首先我们需要有一个放符号的地方,一下
从左往右开始扫描
1.如果遇到数字:
就加入到后缀表达式中
2.如果遇到符号:
若为非括号(‘(’或‘)’)判断该符号与栈顶符号的优先级,若该符号高于栈顶符号,则入栈,否则栈顶元素依此出栈;并加入到后缀表达式中。
若为‘(’则直接入栈。
若为‘)’则栈顶元素出栈,并加入到后缀表达式中,直到遇到‘)’为止。

根据上边写的“7+3*(8+1)-4/2”转换后缀表达式的操作步骤

后缀表达式
7
7+
7 3+
7 3+ *
7 3 8+ * (
7 3 8+ * ( +
7 3 8 1+ * ( +
7 3 8 1 ++ *
7 3 8 1 + * +-
7 3 8 1 + * + 4-
7 3 8 1 + * + 4- /
7 3 8 1 + * + 4 2- /
7 3 8 1 + * + 4 2 / -

代码很垃圾,不值得参考(后面会调整)

#include<iostream>
using namespace std;
struct Node
{
	Node *Next;
	char Data;
};
bool IsHigh(char c_Top, char c_Cur)
{
	if (c_Top == 0) return false;
	if (c_Top == '(') return true;
	if (c_Cur == ')')return true;
	if ((c_Top == '-' ||c_Top == '+')&&(c_Cur == '+' || c_Cur == '-')) return true;
	if ((c_Top == '*' || c_Top == '/')&& c_Cur != '(')return true;
	return false;
}
Node *AddNode(Node *Head,char Data)
{
	Node *Temp = (Node *)malloc(sizeof(Node));
	Temp->Next = Head;
	Temp->Data = Data;
	return Temp;
}
Node *GetNode(Node *Head, char &data)
{
	if (Head == NULL)
	{
		data = 0;
		return Head;
	}
	data = Head->Data;
	Node *Temp = Head->Next;
	free(Head);
	return Temp;
}
int main()
{
	char *Str = (char *)malloc(sizeof(char) * 512);
	Node *Head = NULL;

	while (cin >> Str)
	{
		char *TempStr = (char *)malloc(sizeof(char) * 512);
		int nTempCount = 0;
		memset(TempStr, 0X00, sizeof(char) * 512);
		for (int i = 0; i < strlen(Str); i++)
		{
			if (Str[i] >= '0' && Str[i] <= '9')
			{
				TempStr[nTempCount++] = Str[i];
			}
			else
			{
				while (true)
				{
					char Temp = Head != NULL ? Head->Data : 0;
					int Mark = 0;
					if (IsHigh(Temp, Str[i]))
					{
						Head = GetNode(Head, Temp);
						if (Str[i] == ')')
						{
							Mark++;
						}
						if (Temp != '(')
						{
							TempStr[nTempCount++] = Temp;
							
						}
						else if(Temp == '(')
						{
							if (Mark == 0)
							{
								Head = AddNode(Head, Temp);
							}
							Mark--;
							break;
						}
					}
					else
					{
						break;
					}
				}
				if (Str[i] != ')')
				{
					Head = AddNode(Head, Str[i]);
				}
			}
		}
		while (Head != NULL)
		{
			char Temp = 0;
			Head = GetNode(Head, Temp);
			if (Temp != 0)
			{
				TempStr[nTempCount++] = Temp;
			}
			else
			{
				break;
			}
		}
		cout << TempStr << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值