#include <iostream>
#include<cmath>
#include <iomanip>
#define MAXSIZE 1000
using namespace std;
char op[7] = { '+', '-', '*', '/', '(', ')', '=' };

typedef struct 
{
	char *base;
	char *top;
	int stacksize;
	
}SqStackOPTR;

int InitStack(SqStackOPTR &S)
{
 	S.base=new char [MAXSIZE];
	if(!S.base)
	{
	 	cout<<"失败!" <<endl;return 0;
	}//应该在new后 
 	S.top=S.base;
 	S.stacksize=MAXSIZE;
 	return 1;
}

int Push(SqStackOPTR &S,char e)
{
	if(S.top-S.base==S.stacksize)
	{
		cout<<"PUSH ERROR"<<endl;return 0;	
	}
	*S.top=e;
	S.top++;
	//cout<<"PUSH ing"<<*(S.top-1)<<e<<endl;
	return 1;
}

char GetTop(SqStackOPTR S)
{
	if(S.top!=S.base)
		return *(S.top-1);
}

int Pop(SqStackOPTR &S,char &e)
{
	if(S.top==S.base)
	{
		cout<<"POP ERROR"<<endl;
		return 0;
	}
	S.top--;
	e=*S.top;
	return 1;
}

int In(char ch) {//判断ch是否为运算符
	for (int i = 0; i < 7; i++) {
		if (ch == op[i]) {
			return 1;
		}
	}
	return 0;
}
char Precede(char theta1, char theta2) {//判断运算符优先级
	if ((theta1 == '(' && theta2 == ')') || (theta1 == '=' && theta2 == '=')) {
		return '=';
	} else if (theta1 == '(' || theta1 == '=' || theta2 == '(' || (theta1
			 == '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
		return '<';
	} else
		return '>';
}
double Operate(double first, char theta, double second) {//计算两数运算结果
	switch (theta) {
	case '+':
		return first + second;
	case '-':
		return first - second;
	case '*':
		return first * second;
	case '/':
		return first / second;
	}
	return 0;
}


double EvaluateExpression(char ch) 
{
	SqStackOPTR OPTR;
	char theta;char x;
	InitStack(OPTR); 
	Push(OPTR, '=');
	while (ch != '=' || (GetTop(OPTR) != '=')) //表达式没有扫描完毕或OPTR的栈顶元素不为“=”
	{
		char sign='+';
		if(ch=='-')
		{
			sign=ch;
		}
		if(!In(ch))//不是运算符则解析数字字符串然后进操作数栈
		{
			if(sign=='-')
				cout<<-(ch-48);
			else
			{
				
				cout<<ch-48; 
				cin>>ch;
			}
		}
		else//如果不是数,则比较运算符优先级
		{
			switch (Precede(GetTop(OPTR), ch)) //比较OPTR的栈顶元素和ch的优先级
			{
			case '<': 
				Push(OPTR, ch);
				cin >> ch; //当前字符ch压入OPTR栈,读入下一字符ch
				break;
			case '>':
				Pop(OPTR, theta); //弹出OPTR栈顶的运算符
				cout<<theta;
				break;
			case '=': 
				Pop(OPTR, x);
				cin >> ch; //弹出OPTR栈顶的“(”,读入下一字符ch
				break;
			} //switch
		} 
	}	//while
	cout<<endl;
	return 0;
}

int main()
{

	while (1)
	{			
				char ch;
				cin >> ch;
				//cout << "请输入要计算的表达式" << endl;
				if(ch=='=')break;
				double res = EvaluateExpression(ch);
	}
	return 0;
}

描述

 

输入一个中缀算术表达式,将其转换为后缀表达式。运算符包括+、-、*、/、(、)、=,参加运算的为小于10的自然数。(只考虑二元运算即可)

输入

多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。

输出

对于每组数据输出一行,为表达式的后缀式。

输入样例 1 

9+(3-1)*3+1/2=
1+2=
=

输出样例 1

931-3*+12/+
12+
posted on 2020-02-20 01:42  海月CSDN  阅读(225)  评论(0编辑  收藏  举报