C++程序设计(PEARSON版)第三版12.18答案

本文介绍了一个将中序表达式转换为后序表达式的C++函数实现。通过使用栈来处理运算符和括号,实现了字符串表达式的转换。代码在VS2017上已验证通过。

**12.18(中序转后序)string infixTopostfix(const string&expression)

例如:该函数把中序表达式转换为后续表达式,“(1+2)*3”转换为“12+3*”,把“2*(1+3)”转换为“213+* ”。

对于函数及代码原理的详细解读大家可以看下我的另一篇博客:https://blog.youkuaiyun.com/CHINA_CNN/article/details/89343179

这是这道题的运行截图:

需要特别注意的是:一定一定要注意代码里的括号是英文状态下的,所以输入的时候要输英文状态下的括号才能出正常结果

大家如果有兴趣也可以把下面给出的代码再完善下,为中文括号添加条件,不过下面的代码已经实现题目的要求,因为题目本身是在英文状态下的。

下面直接上这篇作业的代码

以下代码在VS2017上获得通过!

#include "pch.h"
#include <iostream>
#include<string>
#include<vector>
using namespace std;
int pr(char ch)
{
	if (ch == '*' || ch == '/')
		return 1;
	if (ch == '+' || ch == '-')
		return 0;
	if (ch == '(')
		return -1;
	else
		return -2;
}
string infixTopostfix(const string&expression)
{
	int t1 = 0, t2 = 0;
	vector<char>ITP;
	string backup,a;
	a = expression;
	for (unsigned int i = 0; i < a.length(); i++)
	{
		if (a[i] >= '0'&&a[i] <= '9')
			backup+=a[i];
		else if (a[i] == '(')
			ITP.push_back(a[i]);
		else if (a[i] == ')')
		{
			while (ITP.back() != '(' && !ITP.empty())//vetor.at(vetor.size() - 1)
			{
				backup+=ITP.at(ITP.size() - 1);
				ITP.pop_back();
			}
		}
		else if (a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/')
		{
			if (!ITP.empty() && (ITP.at(ITP.size() - 1) == '+'
				|| ITP.at(ITP.size() - 1) == '-' ||
				ITP.at(ITP.size() - 1) == '*' ||
				ITP.at(ITP.size() - 1) == '/'))//这样保证刚开始时进来的和顶上的全是运算元
			{
				t1 = pr(a[i]);
				t2 = pr(ITP.at(ITP.size() - 1));
				if (t2 == -2)//
				{
					//cout << "System mistake!" << endl;
					return "System mistake!";
				}
				else if (t2 >= t1)
				{
					while (!ITP.empty())//&&ITP.back()!='(')//&& ITP.at(ITP.size() - 1) != '(')
					{
						t1 = pr(a[i]);
						t2 = pr(ITP.at(ITP.size() - 1));
						if (ITP.back() != '('&&t2 >= t1)
						{
							backup+= ITP.at(ITP.size() - 1);
							ITP.pop_back();
						}
						else if (t2 < t1)//防止这个a[i]可能入栈失败
						{
							ITP.push_back(a[i]);
							break;
						}
						else if (ITP.back() == '(')
						{
							ITP.push_back(a[i]);
							break;
						}
					}
					if (ITP.empty())
					{
						ITP.push_back(a[i]);
					}

				}
				else
				{
					ITP.push_back(a[i]);
				}
			}
			else
			{
				ITP.push_back(a[i]);
			}
		}
	}
	while (!ITP.empty())
	{
		//cout <<" "<< ITP.back() << endl;
		//ITP.pop_back();
		if (ITP.back() != '(')
		{
			backup+= ITP.at(ITP.size() - 1);
			ITP.pop_back();
		}
		else if (ITP.back() == '(')
		{
			ITP.pop_back();
		}
	}
	return backup;
}
int main()
{
	
	
	string b;
	cout << "中序表达式:";
	cin >> b;
	cout<<"后序表达式:"<<infixTopostfix(b)<<endl;
	cout << "中序表达式";
	cout << "后序表达式:";
	cin >> b;
	cout << "后序表达式:" << infixTopostfix(b) << endl;



	return 0;
}


 

 

目录 第1章 概述 1.1计算机程序设计语言的发展 1.2 面向对象的方法 1.3 面向对象的软件开发 1.4 信息的表示与存储 1.5 程的开发过程 1.6 小结 习题 第2章 C++简单程序设计 2.1 C++语言概述 2.2 基本数据类型和表达式 2.3 数据的输入与输出 2.4 算法的基本控制结构 2.5 自定义数据类型 2.6 小结 习题 第3章 函数 3.1 函数的定义与使用 3.2 内联函数 3.3 带默认形参值的函数 3.4 函数重载 3.5 函数模板 3.6 使用C++系统函数 3.7 小结 习题 第4章 类与对象 4.1 面向对象的思想 4.2 面向对象程序设计的基本特点 4.3 类和对象 4.4 构造函数和析构函数 4.5 类的组合 4.6 类模板 4.7 面向对象标记 4.8 小结 习题 第5章 C++程的结构 5.1 作用域与可见性 5.2 生存期 5.3 数据与函数 5.4 静态成员 5.5 友元 5.6 共享数据的保护 5.7 多文件结构和编译预处理命令 5.8 小结 习题 第6章 数组、指针与字符串 6.1 数组 6.2 指针 6.3 动态内存分配 6.4 字符串 6.5 小结 习题 第7章 继承与派生 7.1 继承与派生 7.2 访问控制 7.3 派生类的构造和析构函数 7.4 派生类成员的标识与访问 7.5 赋值兼容规则 7.6程实例——用高斯消去法解线性方程组 7.7 程实例——一个小型公司的人员信息管理系统 7.8 小结 习题 第8章 多态性 8.1 多态性概述 8.2 运算符重载 8.3 虚函数 8.4 抽象类 8.5 程实例——用变步长梯形积分算法求解函数的定积分 8.6 程实例——对一个小型公司的人员信息管理系统程的改进 8.7 小结 习题 第9章 群体类 9.1 线性群体 9.2 C++标准库中的容器类 9.3 小结 习题 第10章 群体数据的组织 10.1 插入排 10.2 选择排 10.3 交换排 10.4 顺查找 10.5 折半查找 10.6 标准C++库中的算法 10.7 小结 习题 第11章 流类库与输入/输出 11.1 I/O流的概念 11.2 输出流 11.3 输入流 11.4 输入/输出流 11.5 小结 习题 第12章异常处理 12.1 异常处理的基本思想 12.2 C++异常处理的实现 12.3 异常处理中的构造与析构 12.4 小结 习题 第13章 MFC库与Windows程开发概述 13.1 Windows的编程模式 13.2 MFC库简介 13.3 使用VisualC++开发Windows程的步骤 13.4 小结 习题 参考文献
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值