数据结构 栈的应用-- 表达式求值

//EvaluateExpression.h
#include "Stack.h"       //见上一篇博文
#define OP_NUM 7
Status in(char ch, char * arr);
double EvaluateExpression();
void Push_OPDN(SqStack<int> &S1, SqStack<char> &S2);

//EvaluateExpression.cpp
#include "EvaluateExpression.h"
#include <stdio.h>
#include <map>
using namespace std;
char OP[OP_NUM] = {'-', '+', '*', '/', '(', ')', '#'};
map< pair<char, char>, char > table;
Status in(char ch, char *arr)
{
    int i;
	for (i = 0; i < OP_NUM; i ++)
	{
		if (ch == arr[i]) break;
	}
	if (i == OP_NUM)
		return FALSE;
	else
		return TRUE;
}

void  Push_OPDN(SqStack<double> &S1, SqStack<char> &S2)
{
	double index = 1, number = 0;
	char ch;
	if (S2.StackEmpty()) return;
	while (!S2.StackEmpty())
	{
		S2.Pop(ch);
		number += index * (ch - '0');
		index *= 10;
	}
	S1.Push(number);
	return;
}

char Precede(char ch1, char ch2)
{
	table.insert(make_pair( make_pair('+', '+'), '>'));
	table.insert(make_pair( make_pair('+', '-'), '>'));
	table.insert(make_pair( make_pair('+', '*'), '<'));
	table.insert(make_pair( make_pair('+', '/'), '<'));
	table.insert(make_pair( make_pair('+', '('), '<'));
	table.insert(make_pair( make_pair('+', ')'), '>'));
	table.insert(make_pair( make_pair('+', '#'), '>'));

	table.insert(make_pair( make_pair('-', '+'), '>'));
	table.insert(make_pair( make_pair('-', '-'), '>'));
	table.insert(make_pair( make_pair('-', '*'), '<'));
	table.insert(make_pair( make_pair('-', '/'), '<'));
	table.insert(make_pair( make_pair('-', '('), '<'));
	table.insert(make_pair( make_pair('-', ')'), '>'));
	table.insert(make_pair( make_pair('-', '#'), '>'));

	table.insert(make_pair( make_pair('*', '+'), '>'));
	table.insert(make_pair( make_pair('*', '-'), '>'));
	table.insert(make_pair( make_pair('*', '*'), '>'));
	table.insert(make_pair( make_pair('*', '/'), '>'));
	table.insert(make_pair( make_pair('*', '('), '<'));
	table.insert(make_pair( make_pair('*', ')'), '>'));
	table.insert(make_pair( make_pair('*', '#'), '>'));

	table.insert(make_pair( make_pair('/', '+'), '>'));
	table.insert(make_pair( make_pair('/', '-'), '>'));
	table.insert(make_pair( make_pair('/', '*'), '>'));
	table.insert(make_pair( make_pair('/', '/'), '>'));
	table.insert(make_pair( make_pair('/', '('), '<'));
	table.insert(make_pair( make_pair('/', ')'), '>'));
	table.insert(make_pair( make_pair('/', '#'), '>'));

	table.insert(make_pair( make_pair('(', '+'), '<'));
	table.insert(make_pair( make_pair('(', '-'), '<'));
	table.insert(make_pair( make_pair('(', '*'), '<'));
	table.insert(make_pair( make_pair('(', '/'), '<'));
	table.insert(make_pair( make_pair('(', '('), '<'));
	table.insert(make_pair( make_pair('(', ')'), '='));

	table.insert(make_pair( make_pair(')', '+'), '>'));
	table.insert(make_pair( make_pair(')', '-'), '>'));
	table.insert(make_pair( make_pair(')', '*'), '>'));
	table.insert(make_pair( make_pair(')', '/'), '>'));
	table.insert(make_pair( make_pair(')', ')'), '>'));
	table.insert(make_pair( make_pair(')', '#'), '>'));

	table.insert(make_pair( make_pair('#', '+'), '<'));
	table.insert(make_pair( make_pair('#', '-'), '<'));
	table.insert(make_pair( make_pair('#', '*'), '<'));
	table.insert(make_pair( make_pair('#', '/'), '<'));
	table.insert(make_pair( make_pair('#', '('), '<'));
	table.insert(make_pair( make_pair('#', '#'), '='));

	pair<char, char> tmp = make_pair(ch1, ch2);
	return table[tmp];
}

double Compute(double a, char op, double b)
{
	switch(op)
	{
	case '+':
		return a + b;
	case '-':
		return a - b;
	case '/':
		return a / b;
	case '*':
		return a * b;
	default:
		    exit(1);
	}
}

double EvaluateExpression()
{
	SqStack<char> OPTR, DN;
	SqStack<double> OPDN;
	OPTR.InitStack();
	OPDN.InitStack();
	DN.InitStack();
	OPTR.Push('#');
    char ch1, ch2;
	double ret;
	ch1 = getchar();
	while (ch1 != '#' || (OPTR.GetTop(ch2), ch2) != '#')
	{
		if (!in(ch1, OP))   //如果字符不是操作符
		{
			//Push(OPDN, ch1);
			DN.Push(ch1);
			ch1 = getchar();
		}
		else     //字符是操作符
		{
			Push_OPDN(OPDN, DN);
			char c, op;
			double a, b, t;
		    OPTR.GetTop(c);
			switch (Precede(c, ch1))
			{
			case '<':
				OPTR.Push(ch1);
				ch1 = getchar();
				break;
			case '=':
				OPTR.Pop(ch1);
				ch1 = getchar();
				break;
			case '>':
				OPTR.Pop(op);
				OPDN.Pop(b);
				OPDN.Pop(a);
				t = Compute(a, op, b);
				OPDN.Push(t);
				break;
			}
		}
	}
	OPDN.GetTop(ret);
	return ret;
}

//main
#include "EvaluateExpression.h"
#include <iostream>
using namespace std;
int main()
{
	cout << EvaluateExpression() << endl;
}
/*
10-(1+3)#
4+2*3-10/5#
(1+3)*(3+1)#
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值