数据结构 中缀式转后缀式(编译器:VS)

本文介绍了如何将中缀式转换为后缀式,主要涉及数据结构和编译原理。通过建立一个栈,按照操作符的优先级规则进行处理,将中缀表达式中的操作符和数字转化为后缀表达式。在处理过程中,遇到括号时,会根据括号的规则调整操作。同时提到了所需包含的头文件和相关函数的实现。

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

数据结构 中缀式转后缀式

原理:
1.建立一个栈用来储存操作符
2.将中缀式从左到右扫描,如果是数字就存进一个字符串,如果是操作符就遵从以下原则:
若op的优先级高于栈顶的操作符,将该op压栈
若op的优先级低于栈顶的操作符,将栈中的操作符弹出直到栈顶的操作符优先级低于该op,并将弹出的操作符存入刚在的字符串中
若op为“(”,直接压栈
若op为“)”,弹栈直到遇到“(”,且括号舍弃,不存入字符串(后缀式中不具有括号)
3.中缀式扫描完后,将栈中剩余的操作符弹出,存入字符串中

头文件:1.h
在这里插入图片描述
头文件:2.h(栈的定义)
在这里插入图片描述
头文件:3.h(各种函数的实现)

#include "2.h"
Status InitStack(SqStack &S)
{
	S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base) return OVERFLOW;
	S.top = S.base;//当前为空
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status Push(SqStack &S, SElemType e)
{
	SElemType *newbase;
	if ((S.top - S.base) >= S.stacksize)
	{
		newbase = (SElemType*)realloc(S.base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SElemType));
		if (!newbase)  return OVERFLOW;
		S.base = newbase;
		S.top = S.base + S.stacksize;
		S.stacksize = STACK_INIT_SIZE + STACKINCREMENT;

	}
	*S.top = e;
	S.top++;
	return OK;
}


Status StackEmpty(SqStack S)
{
	return (S.base == S.top);
}

Status Pop(SqStack &S, SElemType &e)
{
	if (S.base == S.top) return ERROR;
	S.top--;
	e = *S.top;
	return  OK;
}
Status GetTop(SqStack S, SElemType &e)
{
	if (S.base == S.top) return ERROR;

	e = *(S.top - 1);
	return OK;
}
void Transform(char s[],char d[])//中缀转后缀
{
	SqStack S;
	InitStack(S);
	SElemType e;//记录栈顶的值
	int i,j=0;
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] >= '0'&&s[i] <= '9')
		{
			d[j] = s[i];
			j++;
		}
		
		
		if ( s[i] == '(')
				Push(S, s[i]);
		if (s[i] == '+' || s[i] == '-')
		{
				
				if (!GetTop(S, e))
					Push(S, s[i]);
				while (e=='*'||e=='/')
				{
					Pop(S, d[j]);
					j++;
					GetTop(S, e);
					if (StackEmpty(S))
						break;
				}
				Push(S, s[i]);
				
				
		}
		if (s[i] == '*' || s[i] == '/')
		{
				Push(S, s[i]);
		}
		if (s[i] == ')')
		{
			GetTop(S, e);
			while (e != '(')
			{
				Pop(S, d[j]);
				j++;
				GetTop(S, e);
				if (StackEmpty(S))
					continue;
			}
			Pop(S, e);
		}
		

	}
	while (!StackEmpty(S))
	{
		Pop(S, d[j]);
		j++;
	}
	d[j] = '\0';
}
void Show(char d[])//输出后缀式
{
	int i = 0;
	for (; d[i] != '\0';i++)
	{
		cout << d[i]<<" ";
	}
}

源函数:

int main()
{
	char s[100], d[100];//d储存后缀式
	cout << "请输入表达式:";
	cin >> s;
	Show(s);
	Transform(s, d);
	cout << "后缀式为:";
	Show(d);//将中缀式转换为后缀式

	


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值