数据结构录 之 链表&栈&队列

  三种基本的数据结构,来稍微说一下。

  首先链表,这个几乎每本C++的语言书都会说的,直接看书上说的就好。

  链表就是一个链,每一个都有一个指针指向下一个,然后这样串了起来。然后可以从头开始找,一直找到尾巴。然后对于某个数据点,都可以删除,只需要让他前面那个指向他后面那个,这样从头开始找的时候就找不到这个点了。。。在这个点之后添加一个点也是这样,直接让这个点指向那个新的,然后让新的指向原来这个点指向的后一个。。。

  可以想象就是一个个点,然后第一个指向第二个,第二个指向第三个。。。就像是一条长长的链一样。。。

  然后说一下实现的方法,一般C++的书上的实现方法是弄一个结点类,然后里面包含一个指针,表示指向下一个点,然后通过new和delete去搞。。。这种具体的实现方法建议看看书上的就行,这里不多说了这种。

  因为链表用到的地方实在不多,也就不多说了。

  但是他也是可以很灵活的,比如说在增加一个指针指向前面,这样就能向前找了。再比如形成一个网状的链表,每个点四个指针指向上下左右,这个东西叫做Dance Link()

  然后是队列。

  队列就是像真的队列一样,谁先来谁先买菜。先进先出,First in,First out。

  然后应用到了计算机领域就是往一个东西里面赛东西,也拿东西。然后拿到的只能是最先塞进去的那个。

  然后使用的话有一个STL里面的队列,queue,这个可以自行百度去学习。一般来说使用这个就够了,但是对于ACM来说,如果还想要速度更快的话,就开一个足够大的数组,然后模拟一个,代码如下:

int que[100010];
int first,last;

void init()
{
    first=last=0;
}

void push(int x)
{
    que[last++]=x;
}

int pop()
{
    if(last>first) return que[first++];
    else return 0;
}

  que数组用来存数据,first表示开头那个的位置,last表示最后那个后面一个位置。

  这样的话 last<=first 的时候就表示队列是空的了。

  pop函数就是取队列的第一个元素,push就是往队列里面仍东西。

  这里还要注意init,需要初始化才能使用。

  队列的用处比较大,BFS就是典型的应用(BFS在另一篇有说。)。

  然后队列的升级版比如 优先队列,单调队列,都是很有用的数据结构,之后也会学习到。

  然后就是栈:

  栈的话和队列正好相反,队列是先进去的先出来,栈的话是先进去的最后出来,最后一个进去的先出来,First in,Last out。

  就好像是一个箱子,往里面一本本的放书,然后最先放的在最下面,需要他上面所有的拿出来才能拿这本。

  然后STL里面也有 stack 来用。

  也说一下对于ACM来说,如果是自己实现的话,也是开一个足够大的数组。

int stack[100010];
int top;

void init()
{
    top=0;
}

void push(int x)
{
    stack[top++]=x;
}

int pop()
{
    if(top) return stack[--top];
    else return 0;
}

  各个函数的意义同上,top表示最上面那个元素之后一个的位置,所有top=0表示里面是空的。

  栈的话用的也很多,其实函数的递归调用就是编译器通过栈来实现的,操作系统里面也有很多地方用到了栈。DFS也可以自己通过栈来实现。

  然后栈的升级版单调栈也是很常用的数据结构。

  差不多就这些。但是只是这样单纯的说的话其实理解不深,建议大家最好跟着练习题去做。也就是在 http://acm.hust.edu.cn/vjudge/toIndex.action 这个网站的contest里面搜索SCUT SE 就能找到,有关栈的练习应该是第三场新生训练赛。

时间: 2024-10-22 20:49:12

数据结构录 之 链表&栈&队列的相关文章

数据结构与算法:栈+队列+递归

[栈] Python实现: 1. 用数组实现一个顺序栈 class SStack(): def __init__(self): self._elems = [] def is_empty(self): return self._elems == [] def top(self): if self._elems == []: raise StackUnderflow("in SStack.top()") return self._elems[-1] def push(self, elem

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

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

数据结构之——基于链表的队列的C++模板实现

//节点的结构 template<typename T> struct node { T data; node<T>* next; node():next(nullptr){}; node(T t):data(t),next(nullptr){}; } //模板类构造队列类 template<typename T> Class Myqueue { public: Myqueue():head(nullptr),tail(nullptr),count(0) { head=

&lt;数据结构与算法分析 C++描述&gt; 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

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

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

《Java数据结构与算法》笔记-CH5-链表-5用双端链表实现队列

1 //用双端链表实现队列 2 /** 3 * 节点类 4 */ 5 class LinkQ { 6 private long data; 7 public LinkQ next; 8 9 public LinkQ(long d) { 10 this.data = d; 11 } 12 13 public String toString() { 14 return String.valueOf(this.data); 15 } 16 } 17 /** 18 * 双端链表类 19 */ 20 cl

数据结构实验三《栈和队列》

<数据结构>实验三 栈和队列 一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第5周到第6周,具体集中实验时间为6周第2次课.2个学时. 三.实验内容 1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈.出栈.取栈元素基本操作.然后在主程序中对给定的N个数据进行验证,输出各个

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner; public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;}; } public static class MyLinkedList { Node head=null; public MyLinkedList()