C++实现简易表达式的计算(操作室为10以内)
2017-10-29 21:19
411 查看
1、表达式的表示有三种方式,分别是前缀、中缀和后缀。这里介绍的是中缀的简易表达式的计算。
2、应用的结构是栈结构。对于中缀表达式,需要两个栈,分别是运算符栈operatorStack和操作数栈dataStack。下面是栈的定义。运算符栈存的是char型数据,操作数栈存的是int型数据,所以采用类模板定义。
3、算法思想
函数isp( )代表栈内优先级,icp( )代表栈外优先级。
依次读入表达式中的每个字符,若是操作数,则进dataStack;
若是运算符s1,则和operatorStack中的栈顶元素s2做比较再操作。
若icp(s1)>isp(s2),则运算符s1入栈;
若icp(s1)<isp(s2),则从dataStack的栈顶弹出两个操作数,与operatorStack的栈顶元素做运算,并将运算结果入dataStack;
若icp(s1)==isp(s2),则执行operatorStack的栈顶元素出栈。
直至表达式扫描完毕。
(1)、定义两个全局的函数isp(char a)和icp(char a)表示栈内外的操作符的优先级
(2)、定义全局函数calculate(int a, int b, char c),实现当icp(s1)<isp(s2),从dataStack的栈顶弹出两个操作数,与operatorStack中的栈顶元素的运算操作。
4、main函数的内容
2、应用的结构是栈结构。对于中缀表达式,需要两个栈,分别是运算符栈operatorStack和操作数栈dataStack。下面是栈的定义。运算符栈存的是char型数据,操作数栈存的是int型数据,所以采用类模板定义。
template <class T> class Stack{ private: int maxSize; int top; T *p; public: Stack(int m){ maxSize = m; top = -1; p = new T[maxSize]; } ~Stack(){ maxSize = 0; top = -1; delete []p; } bool Push(const T item); bool Pop(T & item); bool Top(T & item); }; template <class T> bool Stack<T>::Push(const T item) { if(top == maxSize-1) { cout<<"栈满溢出"<<endl; return false; } else { p[++top] = item; return true; } } template <class T> bool Stack<T>::Pop(T & item) { if(top==-1) { return false; } else { item = p[top--]; return true; } } template <class T> bool Stack<T>::Top(T & item) { if(top==-1) { return false; } else { item = p[top]; return true; } }
3、算法思想
函数isp( )代表栈内优先级,icp( )代表栈外优先级。
依次读入表达式中的每个字符,若是操作数,则进dataStack;
若是运算符s1,则和operatorStack中的栈顶元素s2做比较再操作。
若icp(s1)>isp(s2),则运算符s1入栈;
若icp(s1)<isp(s2),则从dataStack的栈顶弹出两个操作数,与operatorStack的栈顶元素做运算,并将运算结果入dataStack;
若icp(s1)==isp(s2),则执行operatorStack的栈顶元素出栈。
直至表达式扫描完毕。
[align=center]操作符[/align] | [align=center]([/align] | [align=center]^[/align] | [align=center]*,/,%[/align] | [align=center]+,-[/align] | [align=center])[/align] |
[align=center]isp[/align] | [align=center]1[/align] | [align=center]7[/align] | [align=center]5[/align] | [align=center]3[/align] | [align=center]8[/align] |
[align=center]icp[/align] | [align=center]8[/align] | [align=center]6[/align] | [align=center]4[/align] | [align=center]2[/align] | [align=center]1[/align] |
int isp(char a)//栈内运算符 { switch(a){ case '(': return 1; case '^': return 7; case '*': case '/': case '%': return 5; case '+': case '-': return 3; case ')': return 8; } } int icp(char a)//栈外运算符 { switch(a){ case '(': return 8; case '^': return 6; case '*': case '/': case '%': return 4; case '+': case '-': return 2; case ')': return 1; } }
(2)、定义全局函数calculate(int a, int b, char c),实现当icp(s1)<isp(s2),从dataStack的栈顶弹出两个操作数,与operatorStack中的栈顶元素的运算操作。
int calculate(int a,int b,char c) { int x=1; switch(c){ case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; case '^': //for循环执行乘方操作 for(int i=0;i<b;i++) x = x*a; return x; case '%': return a%b; } }
4、main函数的内容
int main() { cout<<"输入简易表达式"<<endl; string s; cin>>s; Stack<int> dataStack(10); Stack<char> operatorStack(10); char m; for(int i=0;i<s.length();i++)//检查字符串是否合法 { m = s[i]; if(m>='0' && m<='9') ; else if(m=='('||m=='^'||m=='*'||m=='/'||m=='%'||m=='+'||m=='-'||m==')') ; else { cout<<"字符串里有非法字符"<<endl; return 0; } } for(int i=0;i<s.length();i++) { m = s[i]; if(m>='0' && m<='9') { dataStack.Push(m-48); } else { char n; if(operatorStack.Top(n)) { int m1 = icp(m); int n1 = isp(n); if(m1>n1) operatorStack.Push(m); else if(m1<n1) { char item; operatorStack.Pop(item); int a1; dataStack.Pop(a1); int a2; dataStack.Pop(a2); int temp = calculate(a2,a1,item); dataStack.Push(temp); i--; } else { char item; operatorStack.Pop(item); } } else operatorStack.Push(m); } } char item; while(operatorStack.Pop(item)) { int a1; dataStack.Pop(a1); int a2; dataStack.Pop(a2); int temp = calculate(a2,a1,item); dataStack.Push(temp); } int result; dataStack.Pop(result); cout<<result<<endl; return 0; }
相关文章推荐
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- 一个基于LL(1)的简易C++四则表达式计算
- 反向LL(1)预测分析法的简易C++四则表达式计算
- 用C++程序实现复杂表达式的计算问题
- C++实现顺序计算输入表达式的值
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 算术表达式的计算(基于逆波兰表达式)的c++实现
- Java实现随机出题,10道10以内加减法计算
- C++实现顺序计算输入表达式的值
- 用 C++ 实现的加、减、乘、除表达式计算
- C++实现表达式的计算
- 简单表达式求值的C++代码(10以内不包含括号的加减乘除)
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- 表达式计算(C++实现)
- 表达式的计算(C++实现)
- C++实现 逆波兰表达式计算问题
- 逆波兰表达式 转换和计算 C++实现
- C++实现 逆波兰表达式计算问题
- 实数四则运算表达式的计算,C++ 实现
- 用栈实现表达式计算——C++