您的位置:首页 > 理论基础 > 数据结构算法

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

2012-04-19 20:34 351 查看
//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)#
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 pair table c