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


源代码:https://github.com/yunwei37/myClassNotes
还有不少数据结构和算法相关的笔记以及pta题解哦x


题干

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

输入格式:

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

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

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

思路

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

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章