c++:stack

昌和悦
2023-12-01
#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() << ' ';
	}
else
	S.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();
}


 

 类似资料: