该文章主要介绍栈的链式存储结构以及相关运算。ios
头文件:LinkStack.h算法
#ifndef LINKSTACK_H_ #define LINKSTACK_H_ const int MaxSize = 100; template <typename T> struct LinkStack //链栈结点类 { T data; //数据域 LinkStack *next; //指针域 }; template <typename T> class LinkStackClass //链栈类 { LinkStack<T> *head; //链栈头结点 public: //==================链栈的基本运算算法=========================== LinkStackClass(); //构造函数 ~LinkStackClass(); //析构函数 bool StackEmpty(); //判栈空算法 void Push(T e); //进栈算法 bool Pop(T &e); //出栈算法 bool GetTop(T &e); //取栈顶元素 }; //==================链栈的其余运算算法=========================== template <typename C> void Reverse(LinkStackClass<C> &L);//将链栈中的元素逆置 #endif
源文件:LinkStack.cpp函数
#include <iostream> #include "LinkStack.h" //==================链栈的基本运算算法=========================== template <typename T> LinkStackClass<T>::LinkStackClass() //构造函数 { head = new LinkStack<T>(); head->next = NULL; } template <typename T> LinkStackClass<T>::~LinkStackClass() //析构函数 { LinkStack<T> *pre = head, *p = pre->next; while (p != NULL) { delete pre; pre = p; p = p->next; } delete pre; } template <typename T> bool LinkStackClass<T>::StackEmpty() //判栈空算法 { return (head->next == NULL); } template <typename T> void LinkStackClass<T>::Push(T e) //进栈算法 { LinkStack<T> *p = new LinkStack<T>(); p->data = e; p->next = head->next; head->next = p; } template <typename T> bool LinkStackClass<T>::Pop(T &e) //出栈算法 { LinkStack<T> *p; if (head->next == NULL) //栈空的状况 return false; p = head->next; e = p->data; head->next = p->next; delete p; return true; } template <typename T> bool LinkStackClass<T>::GetTop(T &e) //取栈顶元素 { LinkStack<T> *p; if (head->next == NULL) return false; p = head->next; e = p->data; return true; } //==================链栈的其余运算算法=========================== template <typename C> void Reverse(LinkStackClass<C> &L) { C *temp = new C[MaxSize]; int i = 0; while (!L.StackEmpty()) { C stacktop; L.Pop(stacktop); temp[i] = stacktop; i++; } int j = 0; while (j < i) { L.Push(temp[j]); j++; } delete[]temp; }
主函数:main.cppspa
#include "LinkStack.cpp" using namespace std; //====================链栈的基本运算算法==================== void main() { //=== LinkStackClass<char> st; //定义一个字符链栈st char e; cout << "创建空栈st\n"; cout << "栈st" << (st.StackEmpty()?"空":"不空") << endl; cout << "字符a进栈\n"; st.Push('a'); cout << "字符b进栈\n"; st.Push('b'); cout << "字符c进栈\n"; st.Push('c'); cout << "字符d进栈\n"; st.Push('d'); cout << "字符e进栈\n"; st.Push('e'); cout << "栈st" << (st.StackEmpty()?"空":"不空") << endl; st.GetTop(e); cout << "栈顶元素:" << e << endl; cout << endl<<endl; //=== cout << "逆置链栈中全部元素" << endl; Reverse<char>(st); cout << "出栈序列:"; while (!st.StackEmpty()) { st.Pop(e); cout << e << " "; } cout << endl; cout << "销毁链栈st" << endl; }