栈
一些定义
栈是插入和删除只能在其一端进行的线性表 有序性 后进先出 空栈,top指针=-1 top永远指向栈顶 栈用来存储现在不用将来要用的信息 一些基本操作
从栈顶弹出一个元素
template <class T>
T Stack<T>::Pop(void )
{T temp;
if (top = -1 ){
cerr <<"Attempt to pop an empty stack!" <<endl;
exit (1 );
}
temp = StackList[top]; top --;
return temp;
}
从栈顶压入出一个元素
template<class T >
T Stack<T >::Push(const T & item)
{T temp;
if (top = MaxStackSize - 1 ){
cerr<<"Stack overflow!" <<endl;
exit(1 );
}
top ++;
StackList[top] = item;
}
读栈顶元素
template <class T>
T Stack<T>::Pop(void )
{T temp;
if (top = -1 ){
cerr <<"Attempt to peek empty stack!" <<endl;
exit (1 );
}
return StackList[top];
}
测试栈是否为空
template <class T>
int T Stack<T>:StackEmpty(void ) const
{
return top == -1 ;
}
测试栈是否为满
template <class T>
int T Stack<T>:StackFull(void ) const
{
return top == MaxStackSize - 1 ;
}
template <class T >
class StackNode
{friend class Stack <T >;// friend 有缘函数,让其他类之间互相访问私有函数或数据
private:
T data;
StackNode <T > *next;
StackNode (T d = 0, StackNode <T > *n = NULL )
data(d ) ,next(n )
{}
}
析构函数(用于释放内存空间) 链式栈
链式栈的类声明
template< class T >
Stack < T >: :~Stack ()
{StackNode < T > *p;
while (top != NULL )
{
{p = top;
top = top -> next ;
delete p;}
}
将元素item插入到链式栈的栈顶(链栈插入无需判断栈空)
template< class T >
Stack< T >::Push(const T & item)
{StackNode < T > *p = newNode<T >;
p -> data = item;
p -> next = top;
top = p
}
删除栈顶元素,返回被删除元素的值
template< class T >
Stack< T >::Pop()
{if (IsEmpty());exit(1 );
StackNode < T > *p = top;
T temp = p -> data;
top =top -> next;
delete p;
return temp;
}
读栈顶元素
template< class T>
T Stack < T > ::GetTop ()
{if (IsEmpty());exit(1 );
return top -> data ;
}