您的位置:首页 > 编程语言 > C语言/C++

C++实现简易表达式的计算(操作室为10以内)

2017-10-29 21:19 411 查看
1、表达式的表示有三种方式,分别是前缀、中缀和后缀。这里介绍的是中缀的简易表达式的计算。

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]
(1)、定义两个全局的函数isp(char a)和icp(char a)表示栈内外的操作符的优先级
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息