标签:name 加法 问题 list lis ace c++ 入栈 top
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 true; 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; } }
标签:name 加法 问题 list lis ace c++ 入栈 top
原文地址:http://www.cnblogs.com/yjd_hycf_space/p/6670330.html