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 + -
显示快捷键?