栈的应用----表达式的计算

本文介绍了表达式分类,包括中缀、前缀和后缀表达式,重点讲解了如何将中缀表达式转换为后缀表达式,并详细描述了转换算法。此外,还阐述了如何利用后缀表达式来计算表达式的值,通过顺序扫描表达式,处理操作数和操作符,最终得到表达式的计算结果。
摘要由CSDN通过智能技术生成

表达式分类

(1)中缀表达式:<操作数><操作符><操作数>,例如A+B
(2)前缀表达式:<操作符><操作数><操作数>,例如+AB
(3)后缀表达式:<操作数><操作数><操作符>,例如AB+
在计算机中,编译程序一般使用后缀表达式求解表达式的值,所以我们得先了解如何将中缀表达式转换成后缀表达式

中缀表达式转后缀表达式

为了实现各种转换,需要考虑个操作符的优先级:

操作符 # *,/,% +,-
isp 0 1 5 3 6
icp 0 6 4 2 1

isp(in stack priority)称为栈内优先级,icp(in coming priority)栈外优先级

转换算法描述如下:

  1. 操作符栈初始化,将结束符‘#’进栈,然后读入中缀表达式字符流的首字符ch。
  2. 重复执行以下步骤,直到ch=‘#’,同时栈顶的操作符也是‘#’,停止循环。
    ①若ch是操作数直接输出,读入下一个字符ch
    ②若ch是操作符,判断ch的优先级icp与当前位于栈顶的操作符op的优先级isp
    (1)若icp(ch)> isp(op),令ch进栈,读入下一个字符ch
    (2)若icp(ch)< isp(op),退栈并输出
    (3)若icp(ch)== isp(op),退栈但不输出,若退出的是‘(’号读入下一字符ch。
    ③算法结束,输出序列即为所需的后缀表达式
void postfix() {
   
	//把中缀表达式转换成后缀表达式,输入结束标志为#,而且#一开始先放在s栈底
	SeqStack<char> s1;
	char ch = '#';
	char ch1, op;
	s1.push(ch);
	cin.get(ch);
	while (s1.IsEmpty() == false)
	{
   
		
		//ch是操作数,直接输出
		if (isdigit(ch)) {
   
			cout << ch;
			cin.get(ch);
		}
		else{
              //ch是操作符
			 s1.Top(ch1);
			if (isp(ch1) < icp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值