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

C++实现 逆波兰表达式计算问题

2017-07-08 10:00 483 查看
          C++实现 逆波兰表达式计算问题
 

#include <iostream>
#include <string>
using namespace std;
class Stack
{
private:
int size;
int top;
float *listArray;
public:
Stack(int sz=20);
~Stack();
bool push(float it);//入栈
bool pop(float& it);//出栈
bool isEmpty();//判断栈是否为空
bool isOne();//判断栈里是否一个元素
};
Stack::Stack(int sz)  //栈构造函数
{
size=sz;
top=0;
listArray=new float[size];
}
bool Stack::push(float it)
{
if(top==size)
return false;
listArray[top++]=it;
return true;
}
bool Stack::pop(float& it)
{
if(top==0)
return false;
it=listArray[--top];
return true;
}
bool Stack::isEmpty() //判断站是否为空
{
if(top==0)
return t
4000
rue;
return false;
}
bool Stack::isOne()
{
if(top==1)
return true;
return false;
}
Stack::~Stack()
{
delete listArray;
}
//此函数传进输入的字符串,并对字符串进//行扫描并进行相应处理,得到结果(函数声//明)
void compute(char* str);
int main()
{
char str[20];
cin.getline(str,20,'#');
compute(str);
return 0;
}
//此函数传进输入的字符串,并对字符串进//行扫描并进行相应处理,得到结果(函数体)
void compute(char*  str)
{
Stack aStack;
float x=0,y=0,s1,s2,temp;
int i;
i=0;
while(str[i])
{
switch(str[i])
{
case '+': //加法运算
if(aStack.isOne()||aStack.isEmpty())
{
cout << "表达式不符合要求";
return;
}
aStack.pop(s1);
aStack.pop(s2);
x=s2+s1;
aStack.push(x);
x=0;i++;break;
case '-': //减法运算
if(aStack.isOne()||aStack.isEmpty())
{    cout << "表达式不符合要求";
return;
}
aStack.pop(s1); aStack.pop(s2);
x=s2-s1;
aStack.push(x);
x=0;
i++;
break;
case '*': //乘法运算
if(aStack.isOne()||aStack.isEmpty())
{
cout << "表达式不符合要求";
return;
}
aStack.pop(s1); aStack.pop(s2);
x=s2*s1;
aStack.push(x);
x=0;
i++;
break;
case '/': //除法运算
if(aStack.isOne()||aStack.isEmpty())
{
cout << "表达式不符合要求";
return;
}
aStack.pop(s1);
aStack.pop(s2);
if(s1==0)
{
cout << "分母为0!" << endl;
return;
}
x=s2/s1;
aStack.push(x);
x=0;
i++;
break;
case ' ': //如果是空格,将数据x押入栈中
if(str[i-1]>=48&&str[i-1]<=57)
aStack.push(x);
x=0;
i++;
y=0;
break;
case '.': //获得小数部分
temp=10.0;
while(str[++i]!=' ')                     {
if(str[i]>=48&&str[i]<=57)                y=y+(str[i]-48)/temp;
temp*=10;
}
x+=y;
break;
default: //将字符数字转换为浮点型的数字
if(str[i]>=48&&str[i]<=57)                {
x=x*10+str[i]-48;
i++;
}
}
}
//判断栈是否只有切仅有一个元素,是就输//出结果
if(aStack.isOne())    {
aStack.pop(x);
cout << str << '=' << x << endl;
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: