新手第一篇-逆波兰计算器
来源:互联网 发布:淘宝群 任务有礼 编辑:程序博客网 时间:2024/06/15 05:14
昨天刚刚过了二十岁生日,决定今天开始开始写博客,记录自己的成长,同时也为了以后复习用。回归正题,先上代码
#include<iostream>#include<cctype>using namespace std;typedef double Stack_entry;const int maxstack = 10;enum Error_code{ sucess, overflow, underflow };typedef double Stack_entry;class Stack{public: Stack(); bool empty()const;//如果Stack为空,返回true,否则返回false Error_code pop();//如果Stack非空,删除栈顶元素,如Stack为空,则返回underflow(下溢) Error_code push(const Stack_entry &item);//如果Stack不满,则将元素加到Stack的栈顶,如果Stack是满的,则返回overflow(上溢) Error_code top(Stack_entry &item)const;//非空的Stack的栈顶元素被复制到item。如果Stack空,返回underflow(下溢)private: int count;//数组下标 Stack_entry entry[maxstack];//顺序表};Stack::Stack(){ count = 0;}Error_code Stack::push(const Stack_entry &item){ Error_code outcome = sucess; if (count >= maxstack) outcome = overflow; else entry[count++] = item; return outcome;}Error_code Stack::pop(){ Error_code outcome = sucess; if (count == 0) outcome = underflow; else --count; return outcome;}Error_code Stack::top(Stack_entry &item)const{ Error_code outcome = sucess; if (count == 0) outcome = underflow; else item = entry[count - 1]; return outcome;}bool Stack::empty()const{ bool outcome = true; if (count == 0) outcome = true; else outcome = false; return outcome;}char get_command(){ char command; bool waiting = true;//循环控制条件 cout << "Select command and press[enter]:"; while (waiting) { cin >> command; command = tolower(command); if (command == '?' || command == '=' || command == '+' || command == '-' || command == '*' || command == '/' || command == 'q') waiting = false; else { cout << "Please enter a valid command:" << endl << "[?]push to stack [=]print top" << endl << "[+] [-] [*] [/] are arithmetioc operations" << endl << "[Q]uit" << endl; } } return command;}bool do_command(char command, Stack &numbers){ double p, q; switch (command) { case '?'://将下一位操作数入栈 cout << "Enter a real number:" << flush; cin >> p; if (numbers.push(p) == overflow) cout << "Warning:Sttack full,lost number" << endl; break; case '='://输出操作结果 if (numbers.top(p) == underflow) { cout << "Stack empty" << endl; } else cout << p << endl; break; case'+': if (numbers.top(p) == underflow) cout << "Stack empty" << endl; else { numbers.pop(); if (numbers.top(q) == underflow){ cout << "Stack has just one entry" << endl; numbers.push(p); } else { numbers.pop(); if (numbers.push(p + q) == overflow) cout << "Warning:stack full,lost result" << endl; } } break; case'-': if (numbers.top(p) == underflow) cout << "Stack empty" << endl; else { numbers.pop(); if (numbers.top(q) == underflow) cout << "Stack has just one entry" << endl; else { numbers.pop(); if (numbers.push(p - q) == overflow) cout << "Warning:stack full,lost result" << endl; } } break; case'*': if (numbers.top(p) == underflow) cout << "Stack empty" << endl; else { numbers.pop(); if (numbers.top(q) == underflow) cout << "Stack has just one entry" << endl; else { numbers.pop(); if (numbers.push(p * q) == overflow) cout << "Warning:stack full,lost result" << endl; } } break; case'/': if (numbers.top(p) == underflow) cout << "Stack empty" << endl; else { numbers.pop(); if (numbers.top(q) == underflow) cout << "Stack has just one entry" << endl; else { numbers.pop(); if (numbers.push(p / q) == overflow) cout << "Warning:stack full,lost result" << endl; } } break; case'q': cout << "Calculation finished.\n" << endl; return false; } return true;}void introduce(){ cout << "Please enter a valid command:" << endl << "[?]push to stack [=]print top" << endl << "[+] [-] [*] [/] are arithmetioc operations" << endl << "[Q]uit" << endl;}int main(){ Stack stored_numbers;//定义栈类 introduce();//操作说明 while (do_command(get_command(), stored_numbers));}
源自《Data structures and Program Design In c++》
vs2013环境测试结果:
注意:逆波兰计算器是用栈实现的,可以很好的说明栈的使用。在减法测试中,5先入栈,3后入栈,但结果是-2,说明3先出栈,5后出栈,体现了栈的先入后出的特点。
优点:任何表达式,不管多复杂,都可以不用圆括号进行描述
第一次写,难免有不足之处,有任何问题请网友们批评指正
0 0
- 新手第一篇-逆波兰计算器
- 逆波兰计算器
- 计算器 | 逆波兰表达式
- 逆波兰实现计算器
- 简单逆波兰计算器
- 逆波兰计算器
- 逆波兰表达式计算器
- 逆波兰计算器
- 逆波兰计算器
- 逆波兰计算器
- 逆波兰计算器:
- 逆波兰计算器
- 逆波兰计算器
- 逆波兰计算器
- java 实现逆波兰计算器
- 逆波兰表示法计算器
- 计算器之逆波兰算法
- 逆波兰计算器改进版
- iOS 进制转换(2转10,10转16)
- ocp-434
- android 百度地图定位SDK使用方法
- ocp-435
- ocp-436
- 新手第一篇-逆波兰计算器
- ocp-437
- Servlet学习笔记--jsp+Servlet+MySQL实现用户注册
- CSS技巧(一)
- ocp-438
- ocp-439
- ocp-440
- ocp-441
- grub2启动windows