王道考研数据机构:中缀表达式转为后缀表达式

实现方法:

初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况:

  1. 遇到操作数。直接加入后缀表达式
  2. 遇到界限符。遇到"("直接入栈;遇到")"则依次弹出栈内运算符并加入后缀表达式,直到弹出"("为止。注意:"("不加入后缀表达式。
  3. 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若磁到"("或栈空则停止。之后再把当前运算符入栈。

按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

cpp 复制代码
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef struct Stack{
	char data[MaxSize];
	int top;
}Stack;
void initStack(Stack* &S){
	S = (Stack *)malloc(sizeof(Stack));
	S->top=-1;
}
bool push(Stack * &S, char e){
	if(S->top == MaxSize - 1)
		return false;
	S->data[++S->top] = e;
	printf("元素%c进栈\n",e);
	return true;
}
bool pop(Stack * &S,char &e){
	if(S->top==-1)
		return false;
	e = S->data[S->top--];
	printf("元素%c出栈\n",e);
	return true;
}
bool getTop(Stack * &S, char &e){
	if(S->top==-1)
		return false;
	e = S->data[S->top];
	return true;
}
bool emptyStack(Stack * &S){
	return S->top==-1;
}
int getSymbolPriority(char c){
	if(c=='+'||c=='-')
		return 1;
	else
		return 2;
}
int main()
{
	Stack *s;
	char str[MaxSize];//中缀表达式 
	char houZhui[MaxSize];//后缀表达式 
	int index=0;
	scanf("%s",str);
	initStack(s);
	for(int i=0;str[i]!='\0';i++)
	{
		printf("第%d次操作\n",i+1); 
		if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/')
		{
			int v1 = getSymbolPriority(str[i]);
			while(!emptyStack(s))
			{
				char e;
				getTop(s,e);
				if(e=='(')break;
				int v2 = getSymbolPriority(e);
				if(v2>=v1)
				{
					pop(s,e);
					houZhui[index++]=e;
				}
				else
					break;
			}
			push(s,str[i]);
		}
		else if(str[i]=='(' || str[i]==')')
		{
			if(str[i]=='(')
				push(s,str[i]);
			else
				while(!emptyStack(s))
				{
					char e;
					getTop(s,e);
					if(e=='(')
					{
						pop(s,e);
						break;c
					}
					else
					{
						pop(s,e);
						houZhui[index++]=e;
					}	
				}
		}
		else
		{
			houZhui[index++]=str[i];
		}
		printf("此时后缀表达式元素为:");
		for(int j=0;j<index;j++)
			printf("%c",houZhui[j]);printf("\n\n\n"); 
	}
	printf("栈中剩余元素依次弹出:\n");
	while(!emptyStack(s)){
		char e;
		pop(s,e);
		houZhui[index++]=e;
	}
	printf("\n最终结果为:\n");
	for(int i=0;i<index;i++)
		printf("%c",houZhui[i]);
	return 0;
} 
//A+B-C*D/E+F
//A+B*(C-D)-E/F

运行结果:

输入:

A+B-C*D/E+F

输出:

第1次操作

此时后缀表达式元素为:A

第2次操作

元素+进栈

此时后缀表达式元素为:A

第3次操作

此时后缀表达式元素为:AB

第4次操作

元素+出栈

元素-进栈

此时后缀表达式元素为:AB+

第5次操作

此时后缀表达式元素为:AB+C

第6次操作

元素*进栈

此时后缀表达式元素为:AB+C

第7次操作

此时后缀表达式元素为:AB+CD

第8次操作

元素*出栈

元素/进栈

此时后缀表达式元素为:AB+CD*

第9次操作

此时后缀表达式元素为:AB+CD*E

第10次操作

元素/出栈

元素-出栈

元素+进栈

此时后缀表达式元素为:AB+CD*E/-

第11次操作

此时后缀表达式元素为:AB+CD*E/-F

栈中剩余元素依次弹出:

元素+出栈

A+B-C*D/E+F

转为后缀表达式最终结果为:

AB+CD*E/-F+
输入:

A+B*(C-D)-E/F

输出

第1次操作

此时后缀表达式元素为:A

第2次操作

元素+进栈

此时后缀表达式元素为:A

第3次操作

此时后缀表达式元素为:AB

第4次操作

元素*进栈

此时后缀表达式元素为:AB

第5次操作

元素(进栈

此时后缀表达式元素为:AB

第6次操作

此时后缀表达式元素为:ABC

第7次操作

元素-进栈

此时后缀表达式元素为:ABC

第8次操作

此时后缀表达式元素为:ABCD

第9次操作

元素-出栈

元素(出栈

此时后缀表达式元素为:ABCD-

第10次操作

元素*出栈

元素+出栈

元素-进栈

此时后缀表达式元素为:ABCD-*+

第11次操作

此时后缀表达式元素为:ABCD-*+E

第12次操作

元素/进栈

此时后缀表达式元素为:ABCD-*+E

第13次操作

此时后缀表达式元素为:ABCD-*+EF

栈中剩余元素依次弹出:

元素/出栈

元素-出栈

A+B*(C-D)-E/F

转为后缀表达式最终结果为:

ABCD-*+EF/-

相关推荐
xu_wenming9 分钟前
华为Watch的ECG功能技术分析
人工智能·嵌入式硬件·算法
朱剑君12 分钟前
第六天——贪心算法——字符串分隔
算法
小刘不想改BUG30 分钟前
LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)
linux·算法·leetcode
灵典33636 分钟前
数据结构入门-二叉树的层序遍历
数据结构·算法
范纹杉想快点毕业40 分钟前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
补三补四42 分钟前
随机森林(Random Forest)
人工智能·科技·算法·随机森林·机器学习
轮到我狗叫了1 小时前
力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙编辑力扣300.最长递增子序列
java·数据结构·算法
敲代码的瓦龙1 小时前
STL?list!!!
c语言·开发语言·数据结构·c++·windows·list
赵青临的辉1 小时前
常见机器学习算法简介:回归、分类与聚类
算法·机器学习·回归
程序员莫小特1 小时前
【GESP真题解析】第 20 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
c语言·数据结构·c++·算法·青少年编程·矩阵