c++:stack

来源:互联网 发布:wav播放软件 编辑:程序博客网 时间:2024/05/22 02:22
#ifndef  STACK_CLASS#define STACK_CLASS#include<iostream>#include<cstdlib>using namespace std;const int MaxStackSize = 50;template<class T>class Stack{private:T stacklist[MaxStackSize];int top;public:Stack(void);void Push(const T& item);T Pop(void);void ClearStack(void);T Peek(void) const;int StackEmpty(void) const;int StackFull(void) const;};template<class T>Stack<T>::Stack(void) :top(-1){}template<class T>void Stack<T>::Push(const T& item){if (top == MaxStackSize - 1){std::cerr << "Stack overflow" << endl;exit(1);}top++;stacklist[top] = item;}template<class T>T Stack<T>::Pop(void){T temp;if (top == -1){std::cerr << "attempt to pop an empty stack!" << endl;exit(1);}temp = stacklist[top];top--;return temp;}template<class T>T Stack<T>::Peek(void)  const{if (top == -1){std::cerr << "attempt to peek at an empty stack" << endl;exit(1);}return stacklist[top];}template<class T>int Stack<T>::StackEmpty(void) const{return top == -1;}template<class T>int Stack<T>::StackFull(void) const{return top == MaxStackSize - 1;}template<class T>void Stack<T>::ClearStack(void){top = -1;}#endif
<pre class="cpp" name="code">#include<iostream>#include<cmath>#include<cstdlib>#include<cstring>using namespace std;enum Boolean{False,True};#include"Stack.h"class Calculator{private:Stack<int> S;void Enter(int num);Boolean GetTwoOperands(int &opnd1, int &opnd2);void Compute(char op);public:Calculator(void);void Run(void);void Clear(void);};void Calculator::Enter(int num){S.Push(num);}Boolean Calculator::GetTwoOperands(int &opnd1, int &opnd2){if (S.StackEmpty()){cerr << "Missing operand!" << endl;return False;}opnd1 = S.Pop();if (S.StackEmpty()){cerr << "Missing operand;;" << endl;return False;}opnd2 = S.Pop();return True;}void Calculator::Compute(char op){Boolean result;int operand1, operand2;result = GetTwoOperands(operand1, operand2);if (result == True){switch (op){case '+':S.Push(operand1 + operand2);break;case '-':S.Push(operand1 - operand2);break;case '*':S.Push(operand1 * operand2);break;case '/':if (operand1 == 0){ cerr << "divide by 0" << endl; S.ClearStack();}else S.Push(operand2 / operand1);break;case '^':S.Push(pow(operand2, operand1));break;}cout << '=' << S.Peek() << ' ';}elseS.ClearStack();}Calculator::Calculator(void){  }void Calculator::Run(void){char c[20];while (cin >> c, *c != 'q')switch (*c){case 'c':S.ClearStack();break;case '-':if (strlen(c) > 1)Enter(atoi(c)); else Compute(*c);break;case '+':case '*':case '/':case '^':Compute(*c);break;default:Enter(atoi(c));break;}}void Calculator::Clear(void){S.ClearStack();}
#include"Calculator.h"int main(){Calculator Calculator;Calculator.Run();}



0 0