码迷,mamicode.com
首页 > 其他好文 > 详细

逆波兰式与表达式求解

时间:2014-09-13 21:32:25      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:表达式求解   逆波兰式   波兰式   中序表达式   后序表达式   

/***************
逆波兰式即后缀表示法
  预处理 ———— 中序表达式->逆序表达式(infix to postfix)
	  算法:
	  while(表达式非空)
		if (遇到操作数)
		  直接输出
		else if (遇到操作符op)
		  op是( 直接入栈s
		  op是) s.push输出,直到(
		  op是四则运算,则
			if (s为空 || s.top为( || op 优先级高于 s.top)
			  op 入栈
			else
			  s.push输出
	  if (!s.empty)
		s.push输出
  计算
	  算法:
	  if (遇到操作数)
	      入栈s
	  else (遇到操作符)
	      s.push两个元素进行运算,结果入栈
*******************/
#include <iostream>
#include <stack>
using namespace std;
typedef struct tagCalc
{
	bool is_op;
	union{
		char op;
		int value;
	};
	
}Calc;
int main()
{
	stack<Calc> s;
	Calc calc;
	int ch;
	while (1)
	{
		while ((ch = getchar()) && ch != '\n')
		{
			if (NULL == strchr("+-*/", ch)) //操作数
			{
				if (strchr("()", ch) == NULL)
					printf("%c", ch);
				if ('(' == ch)
				{
					calc.is_op = 1;
					calc.op = ch;
					s.push(calc);
				}
				else if (')' == ch)
				{
					while (!s.empty())
					{
						calc = s.top();
						s.pop();
						if ('(' == calc.op)
							break;
						printf("%c", calc.op);
						
					}
				}
			}
			else
			{
				if (s.empty() || s.top().op == '(' || (NULL != strchr("*/", ch) && NULL != strchr("+-", s.top().op)))
				{
					calc.is_op = true;
					calc.op = ch;
					s.push(calc);
				}
				else
				{
					calc = s.top();
					s.pop();
					printf("%c", calc.op);
				}
					
			}
		}
		while (!s.empty())
		{
			calc = s.top();
			s.pop();
			printf("%c", calc.op);
		}
		printf("\n");
	}
}


		

逆波兰式与表达式求解

标签:表达式求解   逆波兰式   波兰式   中序表达式   后序表达式   

原文地址:http://blog.csdn.net/xianyun2009/article/details/39254917

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!