ptrstack.h

来自「用bcg库编写的java IDE 源码」· C头文件 代码 · 共 165 行

H
165
字号

#include "editlibExp.h"
template<typename StackType>

class EDITPADC_CLASS genStack
{
	struct stackNode
	{
      StackType  Item;
	  stackNode* Next;
	};// end struct
public:
	//constructor and destructor
	 genStack();
	 genStack(const StackType& S);
	 ~genStack();


    //stack operator
    bool StackIsEmpty()const;
	void Push(StackType NewItem /*bool& Success*/);
    void Pop(/*bool& Success*/);
	void Pop(StackType& StackTop /*bool& Success*/);
	void GetStackTop(StackType& StackTope/*bool& Success*/)const;
	long GetStackSize();
	void PopAll();
private:
	stackNode* TopPtr; //points to top of stack
	long       m_nStackSize;
};//end class

template<typename StackType>
genStack<StackType>::genStack() : TopPtr(NULL)
{
  m_nStackSize =0;
}// end default constructor

template<typename StackType>
genStack<StackType>::genStack(const StackType& S)
{
  if(S.TopPtr == NULL)
  {
	TopPtr = NULL; // original list is empty
	m_nStackSize = 0;
  }
  else
  { //copy first node

	 TopPtr = new stackNode;
	 assert(TopPtr != NULL);
	 TopPtr->Item = S.TopPtr->Item;


	 //copy rest of list
	 stackNode* NewPtr = TopPtr;// new list pointer
	 for(stackNode* OrigPtr = S.TopPtr->Next;
	               OrigPtr != NULL;
				   OrigPtr = OrigPtr->Next)
	{
       NewPtr->Next = new stackNode;
	   assert(NewPtr != NULL);
	   NewPtr = NewPtr->Next;
	   NewPtr->Item = OrigPtr->Item;
	}// end for

	NewPtr->Next = NULL;
	m_nStackSize = S.GetStackSize();
  }//end if
}// end copy constructor

template<typename StackType>
genStack<StackType>::~genStack()
{
//  bool Success;

  //pop until stack is empty (Success is false)
  Pop();
  while(!StackIsEmpty())
    Pop();
  //Assertion: TopPtr == NULL
}//end destructor

template<typename StackType>
bool genStack<StackType>::StackIsEmpty()const
{
  return bool(TopPtr == NULL);
}// end StackIsEmpty

template<typename StackType>
void genStack<StackType>::Push(StackType NewItem /*,bool& Success*/)
{
  //create a new node
  stackNode* NewPtr = new stackNode;
  bool Success = bool(NewPtr != NULL); //check allocation

  if(Success)
  {  //allocation successful; set data portion of new node
     NewPtr->Item = NewItem;

	 //insert the new node
	 NewPtr->Next = TopPtr;
	 TopPtr = NewPtr;
	 ++m_nStackSize;
  } // end if
} // end push

template<typename StackType>
void genStack<StackType>::Pop(/*bool &Success*/)
{
  bool Success = bool(!StackIsEmpty());

  if(Success)
  { // stack is not empty; delete top
    stackNode* Temp = TopPtr;
	TopPtr = TopPtr->Next;

	//return deleted node to system
	Temp->Next = NULL; //safeguard
	delete Temp;
	--m_nStackSize;
  } // end if
}// end Pop

template<typename StackType>
void genStack<StackType>::Pop(StackType& StackTop /*,bool& Success*/)
{
   bool Success = bool(!StackIsEmpty());
   if(Success)
   { //stack is not empty; retrieve and delete top
      StackTop = TopPtr->Item;
	  stackNode* Temp = TopPtr;
	  TopPtr = TopPtr->Next;

	  // return deleted node to system
	  Temp->Next = NULL; /// safeguard
	  delete Temp;
	  --m_nStackSize;
   } // end if
} // end Pop

template<typename StackType>
void genStack<StackType>::GetStackTop(StackType& StackTop /*,bool& Success*/)const
{
   bool Success = bool(!StackIsEmpty());
   if(Success)
   {
     // stack is not empty; retreive top
     StackTop = TopPtr->Item;
   }
}// end GetStackTop

template<typename StackType>
long genStack<StackType>::GetStackSize()
{
  return m_nStackSize;
}// end GetStackSize

template<typename StackType>
void genStack<StackType>::PopAll()
{
  while(!StackIsEmpty())
	  Pop();
}// end PopAll

//End of implementation

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?