数据结构与算法——链栈

今天总结链栈。

什么是链栈?

链栈就是栈的链式存储结构,就跟单链表差不多。只不过头指针变成了栈顶指针,这个指针总是指向栈顶元素。栈底结点的指针域指向NULL,当top==NULL时,则栈为空.具体实现时,对比着单链表,然后结合图示,很容易就写出来了。

图示:

实现:

<span style="font-family:Courier New;font-size:14px;">#include <iostream>

using namespace std;
template <class T>
struct Node {
    T data;
    struct Node<T> *next;
};

template <class T>
class LinkStack{
public:
    LinkStack() {
        top = NULL;  //空栈
    }
    ~LinkStack();   //析构函数 释放结点空间
    void Push(T x);  //入栈
    T Pop();         //出栈
    T GetTop();     //得到栈顶元素
    void PrintStack();  //打印栈内元素
    bool IsEmpty();   //判断是否为空栈
private:
    struct Node<T> *top;
};

template <class T>
void LinkStack<T>::Push(T x) {
    Node<T> *p = new Node<T>;
    p->data = x;
    p->next = top;
    top = p ;
}

template <class T>
void LinkStack<T>::PrintStack() {
    Node<T> * p = top;  //保存栈顶指针
    while(top) {
        cout<<top->data<<" ";
        top = top->next;
    }
    top = p;  //使栈顶指针重新指向栈顶元素
    cout<<endl;
}

template <class T>
T LinkStack<T>::Pop() {
    if(IsEmpty()) cout<<"栈为空";
    Node<T> *p = top;
    T x = top->data;
    top = top->next;
    delete p;
    return x;
}

template <class T>
bool LinkStack<T>::IsEmpty() {
    if(top==NULL)
        return true;
    else
        return false;
}

template <class T>
T LinkStack<T>::GetTop() {
    if(IsEmpty()) cout<<"栈为空"<<endl;
    return top->data;
}
template <class T>
LinkStack<T>::~LinkStack() {
    while(top) {
        Node<T> *p = top;
        top = top->next;
        delete p;
    }
}

int main()
{
    LinkStack<int> stack;
    for(int i=0;i<5;i++) {
        stack.Push(i);
    }
    stack.PrintStack();
    cout<<"出栈:"<<endl;
    cout<<stack.Pop()<<endl;
    stack.PrintStack();
    cout<<"获取栈顶元素"<<endl;
    cout<<stack.GetTop()<<endl;
    return 0;
}
</span>
时间: 2024-08-04 10:36:44

数据结构与算法——链栈的相关文章

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

5、蛤蟆的数据结构笔记之五链栈实现

5.蛤蟆的数据结构笔记之五链栈实现 本篇名言:"人生就像奕棋,一步失误,全盘皆输." 昨天对栈和队列进行了定义.这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中. 栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现. 欢迎转载,转载请标明出处: 1.  定义结构体 #define MAX_STACKS10 typedef struct { intkey; /*otherfields */ }element; typedef struct st

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

数据结构与算法之栈

前言:我也是即学即写的,难免有错误.欢迎之处这篇博文的不足之处. 一.什么是栈? 栈是数据结构的一种,他的原理就是后进先出(先进后出是一样的道理),如图(无图言屌) 看到没,你如果把栈当成一个开口向上的容器的话,你最先存储的a1要想取出来,必须把上面的元素都取出来,而你最后一个存储的a5元素却可以第一个取出来.这就是后进先出. PS:我这里的top是指向栈顶元素的,这里用到的top初值是-1.有的书中(好像是严蔚敏的)的top的初始值是0.所以top指向栈顶元素的上一个存储单元.我个人觉得还是t

数据结构与算法JavaScript 栈(一)

数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录下来吧 git代码下载:https://github.com/JsAaron/data_structure.git 栈结构 特殊的列表,栈内的元素只能通过列表的一端访问,栈顶 先入先出(LFIO,last-in-first-out)的数据结构 javascript提供可操作的方法, 入栈 push, 出

数据结构与算法01--堆栈 &amp; 队列

基于顺序表的堆栈 基于链式表的堆栈 1 基于顺序表的堆栈 栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表.由栈的概念衍生出几个子概念,它们是: 1)栈顶,即允许进行插入.删除操作的一端,又称为表尾,用栈顶指针(top)来指示栈顶元素. 2)栈底,即固定端,又称为表头 3)空栈,即栈当中没有数据元素. 顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素. 1.1 方案 顺序栈的基本操作包括: 1) 初始化操作,在初始化操作中将建

12. C#数据结构与算法 -- 顺序栈

理论基础: 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫空栈(Empty Stack). 栈可以分为顺序栈和链栈. 用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack).类似于顺序表,用一维数组来存放顺序栈中的数据元素.栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1

数据结构与算法之七 栈

目标 在本章中,你将学到: 识别栈的特性 实施栈 运用栈来解决编程问题 什么是栈? 栈就是一个只能访问其末尾数据的数据结构,这一端也叫做顶部. 数据仅能在顶部进行插入和删除操作. 最新插入的数据将被最先删除. 因此,栈也被称为后进先出数据结构(Last-In-First-Out). 下列两个基本操作可用于栈上: PUSH(推):入栈 POP(出)  :出栈 PUSH:它是在栈顶部插入新元素的过程. POP:它是从栈顶部删除元素的过程. 现实生活中一些基于LIFO原则的实例. 答案: 一堆书籍:假