1.介绍
我们学习过了单链表,又学过了栈,就会明白将这两个的特点集合就会是一个链栈。
做法是只允许在下标为0的地方插入结点,删除结点,和查看下标为0的元素。
2.操作
这里的链栈是没有头节点的单链表,因为栈上面的三个操作都是O(1)的,因此没有头节点并不会带来打代码的困难。
(1)创建
template<typename T>
LinkStack<T>::LinkStack()
{
top = nullptr;
}
(2)压栈
链栈带来的显著的特点就是不需要在考虑满栈带来的问题。
template<typename T>
void LinkStack<T>::push(const T& val)
{
node* p = new node(val,top);//存放val,next为top
top = p;
}
(3)出栈
template<typename T>
bool LinkStack<T>::pop()
{
if (isEmpty())
return false;
node* p = top;
top = top->next;
delete p;
return true;
}
(4)查看栈顶元素
template<typename T>
const T& LinkStack<T>::getTop()
{
if (isEmpty())
throw("error");
return top->data;
}
总的代码:
#pragma once
template<typename T>
class LinkStack
{
public:
struct node
{
T data;
node* next;
public:
node(const T& d=0,node* n=nullptr):data(d),next(n){}
};
LinkStack();
~LinkStack();
const T& getTop();
bool isEmpty();
void push(const T& val);
bool pop();
private:
node* top;
};
template<typename T>
LinkStack<T>::LinkStack()
{
top = nullptr;
}
template<typename T>
LinkStack<T>::~LinkStack()
{
node* p = top;
while (p)
{
node* q = p;
p = p->next;
delete q;
}
}
template<typename T>
bool LinkStack<T>::isEmpty()
{
if (top)
return false;
return true;
}
template<typename T>
const T& LinkStack<T>::getTop()
{
if (isEmpty())
throw("error");
return top->data;
}
template<typename T>
void LinkStack<T>::push(const T& val)
{
node* p = new node(val,top);
top = p;
}
template<typename T>
bool LinkStack<T>::pop()
{
if (isEmpty())
return false;
node* p = top;
top = top->next;
delete p;
return true;
}