数据结构与算法题目集(中文)7-20 表达式转换 (25分) 题解

2023-02-11 09:52:55 浏览数 (1)


我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机、地理信息科学知识库 > 还有不少数据结构和算法相关的笔记以及pta题解哦x


题干

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含 、-、*、以及左右括号(),表达式不超过20个字符。 输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2 3*(7-4) 8/4

输出样例:

2 3 7 4 - * 8 4 /

思路

使用栈进行中缀表达式的计算

代码语言:javascript复制
#include<stdio.h>
#include<ctype.h>
#include<vector>
using namespace std;

int main(){
	vector<char> a;
	char ch;
	int x;
	int flag=0;
	ch=getchar();
	if(ch=='(')
		a.push_back(ch);
	else if(ch!=' ')
		putchar(ch);
	while((ch=getchar())!='n'){
		if(isdigit(ch)&&flag){
			putchar(' ');
			putchar(ch);
			flag=0;
		}else if(isdigit(ch)||ch=='.')
			putchar(ch);
		else if(flag&&(ch=='-'||ch==' ')){
			putchar(' ');
			putchar(ch);
			flag=1;			
		}
		else if(ch=='*'||ch=='/'){
			flag=1;
			if(a.empty())
				a.push_back(ch);
			else if(a.back()==' '||a.back()=='-'||a.back()=='(')
				a.push_back(ch);
			else{
				putchar(' ');
				putchar(a.back());
				a.pop_back();
				a.push_back(ch);
			}
		}else if(ch==' '||ch=='-'){
			flag=1;
			if(a.empty()||a.back()=='(')
				a.push_back(ch);
			else{
				while(!a.empty()&&(a.back()!=' '&&a.back()!='-')){
					putchar(' ');
					putchar(a.back());
					a.pop_back();
				}if(!a.empty()){
					putchar(' ');
					putchar(a.back());
					a.pop_back();
				}
				a.push_back(ch);
			}
		}else if(ch=='('){
			a.push_back(ch);
		}else{
			while(!a.empty()&&a.back()!='('){
				putchar(' ');
				putchar(a.back());
				a.pop_back();
			}
			if(!a.empty())
				a.pop_back();
		}
	}
	while(!a.empty()){
		putchar(' ');
		putchar(a.back());
		a.pop_back();
	}
	return 0;
}

0 人点赞