数据结构 栈的应用-- 表达式求值
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)# */
相关文章推荐
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- JavaScript数据结构中栈的应用之表达式求值问题详解
- 【数据结构】栈的应用 I :表达式求值
- 数据结构:栈的典型应用之二:四则运算表达式求值(C++)
- 数据结构 算法3.4(栈的应用) 表达式求值(stl版and数组模拟版)
- 表达式求值(数据结构-栈的应用 )
- 【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
- 回顾数据结构之栈的应用-表达式求值
- 表达式求值 数据结构 C/C++ 栈的应用
- 数据结构Java实现——①栈-->栈的应用三、算术表达式求值
- 表达式求值(数据结构书上栈的应用之一)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (转载)
- 数据结构 - 栈的应用:表达式求值(C)
- 数据结构--栈的应用(表达式求值 nyoj 35)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 第三章:顺序栈及其应用之一---表达式求值
- 栈的应用 表达式求值
- 简单栈应用-表达式求值
- 栈的应用——表达式求值
- 栈的应用:四则运算表达式求值