链栈是用链表实现的,它在内存中存放时不连续的,而且存放的节点数目不定,可根据实际情况进行插入或删除。这可以使它更合理地利用内存资源,会使程序更加灵活,使内存开销更小。
链栈与链表区别在于:
(1)链栈没有头结点,链表为了统一对空表与非空表操作加入头结点
(2)链栈没有头指针与尾指针
(3)栈中元素受限,用户仅可以访问栈顶
LinkStack.h文件代码如下:
#include <iostream>
using namespace std;
template <class T>
class LinkStackNode {
public:
T data;
LinkStackNode<T>* next;
LinkStackNode(T& d) : data(d), next(NULL){}
};
template <class T>
class LinkStack {
public:
LinkStack() : top(NULL){}
~LinkStack();
void push(T& value);
T& getTop();
T pop();
bool isEmpty();
private:
LinkStackNode<T> * top;
};
template <class T>
LinkStack<T>::~LinkStack() {
delete top;
}
template <class T>
void LinkStack<T>::push(T& value) {
LinkStackNode<T>* addNode = new LinkStackNode<T>(value);
addNode->next = top;
top = addNode;
}
template <class T>
T& LinkStack<T>::getTop()
{
return top->data;
}
template <class T>
T LinkStack<T>::pop()
{
T value = top->data;
LinkStackNode<T>* p = top;
top = top->next;
delete p;
return value;
}
template <class T>
bool LinkStack<T>::isEmpty()
{
return top == NULL;
}
Main.cpp代码如下:
#include "LinkStack.h"
using namespace std;
int main(int argc, char const *argv[])
{
/* code */
LinkStack<int> s;
int i;
for(i = 0; i < 5; ++i){
s.push(i);
}
cout << s.getTop() << endl;
for(i = 0; i < 3; i++)
{
cout << s.pop() << endl;
}
cout << s.getTop() << endl;
return 0;
}