栈解决简单的后缀表达式运算

本文介绍了如何利用栈的先进后出特性将中缀表达式转换为后缀表达式,以及如何计算后缀表达式。转换过程中,数字直接加入结果数组,遇到运算符时与栈顶运算符比较优先级。计算后缀表达式时,数字入运算数栈,遇到运算符则取出栈顶两个数字进行运算。
摘要由CSDN通过智能技术生成

栈实现后缀表达式转化和计算

利用栈的先进后出特性可以方便地将中缀表达式转换为后缀表达式:

转换函数定义 void trans(char* exp, char postexp[])
exp为输入的算术表达式字符串,postexp为结果字符数组。此算法还需要一个运算符栈用来转换所有的运算符。

对于输入的字符串依次读取,如果读入的是数字,则直接读入postexp数组,并在读取完一个数字后加上‘#’表示一个数字读取完,方便后续计算后缀表达式。

若读入的是一个运算符,则利用运算符转换栈来转换,有如下情况:

  • 读入一个运算发,此时栈为空,直接push。
  • 栈内有预算符,则和栈顶运算符比较优先级,若优先级高于栈顶元素(读入运算符要先运算)则直接push,否则将栈顶元素出栈,输入到postexp数组,重复和栈顶比较。
  • 若栈顶是’('则直接push

将整个exp字符串读完以后,将运算符栈依次出栈到postexp数组,完成转换。

可以到我的代码仓库查看源代码。


#pragma once
#include "SqStack.h"

void trans(char* exp, char postexp[])
{
	char e;
	SqStack* Optr;
	InitStack(Optr);
	int i = 0;
	while (*exp != '\0')
	{
		switch (*exp)
		{
		case'(':
			Push(Optr, '(');
			exp++;
			break;
		case')':
			Pop(Optr, e);
			while (e != '(')
			{
				postexp[i++] = e;
				Pop(Optr, e);
			}
			exp++;
			break;
		case'+':
		case'-':
			while (!StackEmpty(Optr))
			{
				GetTop(Optr, e);
				if (e != '(')
				{
					postexp[i++] = e;
					Pop(Optr, e);
				}
				else
					break;
			}
			Push(Optr, *exp);
			exp++;
			break;
		case'*':
		case'/':
			while (!StackEmpty(Optr))
			{
				GetTop(Optr, e);
				if (e == '*' || e == '/')
				{
					postexp[i++] = e;
					Pop(Optr, e);
				}
				else
					break;
			}
			Push(Optr, *exp);
			exp++;
			break;
		default:
			while (*exp >= '0' && *exp <= '9')
			{
				postexp[i++] = *exp;
				exp++;
			}
			postexp[i++] = '#';
		}
	}
	while (!StackEmpty(Optr))
	{
		Pop(Optr, e);
		postexp[i++] = e;
	}
	postexp[i] = '\0';
	DestroyStack(Optr);
}

后缀表达式的计算:

运算过程中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值