用链表实现堆栈

来源:互联网 发布:泰国旅游网络 编辑:程序博客网 时间:2024/06/07 00:57

堆栈(stack)是一组相同数据类型数据的集合,且拥有后入先出(last in first out)的特性,即堆栈的所有操作都是在顶端进行的。堆栈有五个基本操作:

Create创建一个空堆栈。Push把数据压入堆栈顶端,并返回新堆栈。Pop从堆栈顶端弹出数据,并返回新堆栈。Empty判断堆栈是否为空堆栈,是空则返回true,否则返回false。Full判定堆栈是否已满,已满则返回true,否则返回false。

        许多算法用到堆栈,如递归、二叉树、森林的遍历。在C++语音中可以用数组结构和链表结构方式实现堆栈。用数组结构的优点是算法简单,但缺点突出,就是数组本身需要事先设置大小,不灵活。而链表结构实现的优缺点与数组结构的相反,即优点是随时可以动态改变链表的长度,缺点是算法较复杂。下面用链表实现堆栈:

#include <iostream>#include <cstdlib>#include <iomanip>using namespace std;class Node{public:int iData;class Node *Next;};typedef class Node StackNode;typedef StackNode *SingleLinkedStack;//定义链表堆栈的新类型SingleLinkedStack pTop = NULL;    //指向堆栈顶端的指针//判断是否为空堆栈bool fnisEmpty(){    if(NULL == pTop){return true;}    else{return false;}}int fnPush(const int iPushData){    SingleLinkedStack pNewNode;//新加入节点的指针    pNewNode = new StackNode;    pNewNode->iData = iPushData;    pNewNode->Next = pTop;//将新节点指向堆栈的顶端    pTop = pNewNode;//新节点成为堆栈的顶端return pTop->iData;}int fnPop(){int iTemp;    SingleLinkedStack ptr;    if(fnisEmpty())    {cout << "The stack is empty,you can't pop.";          return false;     }    else    {        ptr = pTop;        pTop = pTop->Next;//将堆栈顶端的指针指向下一个节点        iTemp = ptr->iData;        delete ptr;return iTemp;    }}int main(){    int iData;    cout << "请按序输入5个数据:" << endl;    for(int i = 0; i < 5;i++)    {cin >> iData;fnPush(iData);    }    while(!fnisEmpty()) {cout << "堆栈依次弹出的整数为:" << fnPop() << endl;     }    return true; }


原创粉丝点击