【数据结构】栈的应用——中缀表达式求值(c++)

来源:互联网 发布:mac自动播放照片 编辑:程序博客网 时间:2024/05/22 03:35

头文件:


#pragma once#include <iostream>#include <assert.h>#include <string>using namespace std;template<class Type>class SeqStack{public:SeqStack(size_t sz = INIT_SZ);~SeqStack();public:bool empty()const;bool full()const;void show()const;bool push(const Type &x);bool pop();void gettop(Type &x);int length()const;void clear();void destory();void quit_system(Type &x);private:enum{ INIT_SZ = 64 };Type *base;int capacity;int top;};template<class Type>SeqStack<Type>::SeqStack(size_t sz = INIT_SZ){capacity = sz > INIT_SZ ? sz : INIT_SZ;base = new Type[capacity];assert(base != NULL);top = 0;}template<class Type>SeqStack<Type>::~SeqStack(){destory();}// 判断栈是否满了template<class Type>bool SeqStack<Type>::full()const{return (top >= capacity);}// 判断是否为空栈template<class Type>bool SeqStack<Type>::empty()const{return (top == 0);}// 显示template<class Type>void SeqStack<Type>::show()const{if (top == 0){cout << "the stack is empty!" << endl;return;}for (int i = top - 1; i >= 0; --i){cout << base[i] << endl;}}// 入栈template<class Type>bool SeqStack<Type>::push(const Type &x){if (full()){cout << "the stack is full,can not enter!" << endl;return false;}else{base[top] = x;top++;return true;}}// 出栈template<class Type>bool SeqStack<Type>::pop(){if (empty()){cout << "the stack is empty,can not pop!" << endl;return false;}else{top--;return true;}}// 获得栈顶元素template<class Type>void SeqStack<Type>::gettop(Type &x){x = base[top - 1];}// 求栈长度template<class Type>int SeqStack<Type>::length()const{return top;}// 清空栈template<class Type>void SeqStack<Type>::clear(){top = 0;}// 摧毁栈template<class Type>void SeqStack<Type>::destory(){delete[]base;base = NULL;capacity = top = 0;}// 退出系统template<class Type>void SeqStack<Type>::quit_system(Type &x){x = 0;}


主函数:


#include "exp.h"#include "exp.h"//检查符号之间的优先级,1表示>,0表示=,-1表示<,c1栈内的运算,c2栈外的运算int check(char c1, char c2){int a1, a2;if (c1 == '+' || c1 == '-')a1 = 3;if (c1 == '*' || c1 == '/')a1 = 5;if (c1 == '(')a1 = 1;if (c1 == ')')a1 = 7;if (c1 == '#')a1 = 0;if (c2 == '+' || c2 == '-')a2 = 2;if (c2 == '*' || c2 == '/')a2 = 4;if (c2 == '(')a2 = 6;if (c2 == ')')a1 = 1;if (c2 == '#')a2 = 0;if (a1 > a2)return 1;if (a1 == a2)return 0;if (a1 < a2)return -1;}//符号运算函数double sum(char c, double d1, double d2){switch (c){case '+':return d1 + d2;break;case '-':return d1 - d2;break;case '*':return d1 * d2;break;case '/':return d1 / d2;break;default:break;}}int main(){char *op = "+-*/()#";string str;cin >> str;//给表达式字符串str添加‘#’结束标志符str.append(1, '#');SeqStack<char> OPTR;//运算符栈SeqStack<double> OPND;//操作数栈int a = -1;//先将'#'入栈OPTR.push('#');while (true){int b = a + 1;a = str.find_first_of(op, a + 1);if (a == string::npos)break;if (a != b){string ss(str, b, a - b);double d = atof(ss.c_str());//数据先入栈OPND.push(d);}//运算符优先级比较char val;OPTR.gettop(val);int che = check(val, str[a]);if (-1 == che)//栈外优先级大直接入栈{OPTR.push(str[a]);}if (0 == che)//栈内外优先级相等则出栈{OPTR.pop();}if (1 == che)//栈内优先级大,出栈进行运算{char val;OPTR.gettop(val);double d1;OPND.gettop(d1);OPND.pop();double d2;OPND.gettop(d2);OPND.pop();d1 = sum(val, d2, d1);//运算结果入栈OPND.push(d1);OPTR.pop();a--;}}double s;OPND.gettop(s);cout << s << endl;return 0;}



0 0
原创粉丝点击