棧之尾碼計算機

來源:互聯網
上載者:User

#include <iostream.h>
#include <stdlib.h>

const int MaxStackSize = 50;
typedef double DataType;

class Stack
{
 private:
  DataType stacklist[MaxStackSize];
  int top;

 public:
  Stack(void);

  void Push(const DataType& item);
  DataType Pop(void);
  void ClearStack(void);

  DataType Peek(void) const;

  int StackEmpty(void) const;
  int StackFull(void) const;
};

Stack::Stack()
{
 top = -1;
}

void Stack::Push(const DataType& item)
{
 if (top == MaxStackSize - 1)
 {
  cerr << "Stack overflow" << endl;
  exit(1);
 }

 stacklist[++top] = item;
}

DataType Stack::Pop()
{
 DataType temp;

 if (top == -1)
 {
  cerr << "Attempt to pop an empty stack" << endl;
  exit(1);
 }
 
 temp = stacklist[top--];

 return temp;
}

DataType Stack::Peek(void) const
{
 DataType temp;

 if (top == -1)
 {
  cerr << "Attempt to pop an empty stack" << endl;
  exit(1);
 }
 
 temp = stacklist[top];

 return temp;
}

int Stack::StackEmpty() const
{
 return top == -1;
}

int Stack::StackFull() const
{
 return top == MaxStackSize - 1;
}

void Stack::ClearStack()
{
 top = -1;
}

class Calculator
{
 private:
  Stack s;

  void Enter(double num);
  bool GetTwoOperands(double& opnd1, double& opnd2);
  void Compute(char op);
 public:
  //Calculator(void);
  void Run(void);
  void Clear(void);
};

void Calculator::Enter(double num)
{
 s.Push(num);
}

bool Calculator::GetTwoOperands(double& opnd1, double& 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)
{
 bool result;
 double operand1,operand2;

 result = GetTwoOperands(operand1,operand2);

 if (result)
 {
  switch(op)
  {
   case '+':
    s.Push(operand2 + operand1);
    break;
   case '-':
    s.Push(operand2 - operand1);
    break;
   case '*':
    s.Push(operand2 * operand1);
    break;
   case '/':
    s.Push(operand2 / operand1);
    break;
  }
 }
 else
 {
  s.ClearStack();
 }
}

void Calculator::Run()
{
 char c;
 double newoperand;

 while (cin >> c, c != '=')
 {
  switch(c)
  {
   case '+':
   case '-':
   case '*':
   case '/':
    Compute(c);
    break;
   default:
    cin.putback(c);
    cin >> newoperand;
    Enter(newoperand);
    break;
  }
 }

 if (!s.StackEmpty())
 {
  cout << s.Peek() << endl;
 }
}

void Calculator::Clear()
{
 s.ClearStack();
}

void main()
{
 Calculator calc;
 
 calc.Run();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.