MyGrowStack
来源:互联网 发布:淘宝太空棉衣服真的吗 编辑:程序博客网 时间:2024/06/09 20:25
//MyGrowStack.h#if !defined (STACK_H)#define STACK_Hconst int InitStack=1;const int ShrinkNum=8;const int Maxbufsize=20;const int TokError=0;const int TokNum=1;class IStack{friend class StackSeq;public:IStack();~IStack();int Pop();void Push(int n); int Top() const;bool IsEmpty() const;private:void Shrink();void Grow();int* _arr;int _capacity;int _top;};class StackSeq{public:StackSeq(IStack const& stack);bool AtEnd() const;void Advance(); int GetNum() const;private:int _iCurr;IStack const& _stack;};class Input{public:Input();int Token() const;int Number() const;private:char _buf[Maxbufsize];int _token;};class Calculator{public:Calculator(){} IStack const& GetStack() const { return _stack;} bool Execute(Input const& input);private: int Calculate(int num1,int num2,int token) const; IStack _stack;};#endif
//main.cpp#include <iostream>#include "MyGrowStack.h"int main(){ Calculator theCalculator;bool statue;do {std::cout<<">";Input input;statue=theCalculator.Execute(input);if (statue){for (StackSeq seq(theCalculator.GetStack());!seq.AtEnd();seq.Advance()){std::cout<<" "<<seq.GetNum()<<std::endl;}}} while (statue);return 0;}//MyGrowStack.h
#include <iostream>#include <cctype>#include <cstdlib>#include <cassert>#include "MyGrowStack.h"IStack::IStack():_top(0),_capacity(InitStack){ _arr=new int[_capacity];}IStack::~IStack(){delete []_arr;}void IStack::Shrink(){ int * newArr=new int[_top*2];for (int i=_top-1;i!=0;i--){newArr[i]=_arr[i];}delete _arr;_capacity=_top*2;_arr=newArr;}void IStack::Push(int n){assert(_top<=_capacity);if (_top==_capacity){Grow();}_arr[_top++]=n;}int IStack::Pop() {assert(0<_top);if (_top*3<=_capacity){Shrink();}return _arr[--_top];}int IStack::Top() const{assert(_top>0);return _arr[_top-1];}bool IStack::IsEmpty() const{return _top==0;}void IStack::Grow(){std::cout<<"Doubling stack from "<<_capacity<<std::endl;int *pTemp=new int[_capacity*2];for (int i=0;i!=_capacity;i++){pTemp[i]=_arr[i];}_capacity+=_capacity;delete []_arr;_arr=pTemp;}StackSeq::StackSeq(IStack const& stack):_stack(stack),_iCurr(0){}bool StackSeq::AtEnd() const{return _iCurr==_stack._top;}void StackSeq::Advance(){assert(!AtEnd());++_iCurr;}int StackSeq::GetNum() const{assert(!AtEnd());return _stack._arr[_iCurr];}Input::Input(){std::cin>>_buf;int c=_buf[0];if (std::isdigit(c)){_token=TokNum;}else if (c=='+'||c=='*'||c=='/'||c=='|'||c=='&'){_token=c;}else if (c=='-'){if (std::isdigit(_buf[1])){_token=TokNum;}else_token=c;}else_token=TokError;}int Input::Token() const{return _token;}int Input::Number() const{assert(_token==TokNum);return std::atoi(_buf);}bool Calculator::Execute(Input const& input){int token=input.Token();bool statue=false;if (token==TokError){std::cout<<"Unkonw token!"<<std::endl;}else if (token==TokNum){ _stack.Push(input.Number());statue=true;}else{ if (_stack.IsEmpty()) {std::cout<<"Stack is empty!"<<std::endl; }else{ int num1=_stack.Pop(); int num2; if (_stack.IsEmpty()) { num2=num1; } else num2=_stack.Pop(); _stack.Push(Calculate(num1,num2,token)); statue=true;}}return statue;}int Calculator::Calculate(int num1,int num2,int token) const{ int result;switch(token){case '+':result=num1+num2;break;case '-':result=num1-num2;break;case '|':result=num1|num2;break;case '&':result=num1&num2;break;case '*':result=num1*num2;break;case '/':result=num1/num2;break;default:break;}return result;}
- MyGrowStack
- [转载]SqlConnection,SqlCommand,SqldataReader的用法总结:
- View的显示状态GONE,VISIBLE和INVISIBLE区别
- crcale 的入门简介和基础查询语句
- 今天遇到一问题,ios 应用 App 的Icon 变白问题。
- 08、J2SE基础-Properties类,System类与Runtime类
- MyGrowStack
- linklist2
- HTML与CSS教学-第3章 HTML网页头部标记
- c#
- 如何使用Objective-C解析HTML和XML
- QuickContact分析及其弹出窗口实现
- 批处理——重命名特殊文件名
- 笔试
- C/C++语言最新华为机试题“大数相加算法”