数据结构和算法学习总结03 线性表---队列

队列

队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。

与栈的比较:

1.队列先进先出,栈先进后出

2.从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。

但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"

栈是限定只能在表的一端进行插入和删除操作的线性表;队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。

队列同样分为顺序队列和链式队列,我们一般用链式队列:

#include <iostream>
using namespace std;  

struct Node
{
    int data;
    struct Node *next;
};  

class Queue
{
public:
    Queue( )               //构造函数,初始化一个空的链队列
    {
        Node *s;
        s=new Node;
        s->next=NULL;
        front=rear=s;
    }
    ~Queue( )               //析构函数,释放链队列中各结点的存储空间
    {
        while(front)
        {    Node *p;
        p=front->next;
        delete front;
        front=p;}
    }  

    void EnQueue(int v);   //将元素x入队
    int DeQueue();         //将队头元素出队
    int GetQueue();        //取链队列的队头元素
    bool IsEmpty( );         //判断链队列是否为空 

    void Intput(int n);
    void Output();
private:
    Node *front, *rear;    //队头和队尾指针,分别指向头结点和终端结点
};   

void Queue::EnQueue(int v)
{
    Node *s;
    s=new Node;
    s->data=v;          //申请一个数据域为x的结点s
    s->next=NULL;
    rear->next=s;       //将结点s插入到队尾
    rear=s;
}  

int Queue::DeQueue()
{
    Node *p; int x;
    if (rear==front) cout<<"Null"<<endl;
    p=front->next;
    x=p->data;                       //暂存队头元素
    front->next=p->next;             //将队头元素所在结点摘链
    if (p->next==NULL)
        rear=front;                     //判断出队前队列长度是否为1
    delete p;
    return x;
}    

int Queue::GetQueue()
{
    if (front!=rear)
        return front->next->data;
}  

bool Queue::IsEmpty( )
{
    if(front==rear)
        return 1;
    else
        return 0;
} 

void Queue::Intput(int n)
{
    int v;
    for(int i =0; i<n; i++)
    {
        cout<<"请输入元素的值:"<<endl;
        cin>>v;
        EnQueue(v);
    }
}

void Queue::Output()
{
    Node *p;
    p = front;
    while(p!=rear)
    {
        p=p->next;
        cout<<p->data<<" ";
    }
    cout<<endl;
}   

int main()
{
    Queue l;
    cout<<l.IsEmpty()<<endl;
    l.Intput(5);
    cout<<l.IsEmpty()<<endl;
    l.Output();
    l.EnQueue(6);
    l.DeQueue();
    l.Output();
}
时间: 2024-10-22 15:10:29

数据结构和算法学习总结03 线性表---队列的相关文章

数据结构和算法学习总结03 线性表---顺序表

线性表是最简单.也是最基本的一种线性数据结构. 它有两种存储表示法:顺序表和链表,最基本的操作是插入.删除和查找等. 顺序表的基本操作如下: #include <stdio.h> #include <stdlib.h> #define EXIST 1 //存在数据元素,不为空 #define EMPTY 0 //为空 #define OK 1 //成功 #define ERROR 0 //出现错误 #define OVERFLOW -1 //元素溢出 const int LIST_

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

数据结构与算法(三)-线性表之静态链表

前言:前面介绍的线性表的顺序存储结构和链式存储结构中,都有对对象地引用或指向,也就是编程语言中有引用或者指针,那么在没有引用或指针的语言中,该怎么实现这个的数据结构呢? 一.简介 定义:用数组代替指针或引用来描述单链表,即用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法: 上面的静态链表图有两个数组游标和数据,其中数据数组存储数据,而游标数组存储同下标为数据的下一个数据的下标值,简单模拟一下静态链表遍历的过程: 先查看下标为999的游标数组值:1: 根据游标数组值1,查找下标为1的数据:

数据结构与算法(四)-线性表之循环链表

前言:前面几篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度.不循环的链表),对于单链表,由于每个节点只存储了向后的指针,到了尾部标识就停止了向后链的操作.也就是说只能向后走,如果走过了,就回不去了,还得重头开始遍历,所以就衍生出了循环链表 一.简介 定义:将单链表中中断结点的指针端有空指针改为指向头结点,就使整个单链表形成一个环,这种头尾详解的单链表称为单循环链表,简称循环链表: 特性: 若链表为空,则头结点的next结点还是指向其本身,即head.next

《数据结构与算法》第二章 线性表

线性表 定义: 由n个特性相同 数据元素(即可有很多数据项)构成的有限序列,同时相邻数据元素之间存在 序偶 关系. 线性表中元素个数就是 表长 . 特点: ·存在唯一一个被称为 “第一个” 的数据元素(线性起点.起始结点): ·存在唯一一个被称为 “最后一个” 的数据元素(线性终点.终端结点): ·除第一个以外,结构中的每个数据元素均 只有一个前驱 : ·除最后一个外,结构中的每个数据元素均 只有一个后继 . 顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素

数据结构与算法学习 第1季03 栈 队列 树 图

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 栈:LIFO的线性表 队列:FIFO的线性表 树:(递归定义)n个结点的有穷集合,对非空树,有且仅有一个称为根的结点,n>1时,其余结点分为m个互不相交的有限集,而每一个集合本身也是一棵树,并称为根的子树 图:任意两个数据元素之间都可以存在关系的组织结构 二叉树的存储:可以选择用多重链表的数据结构 二叉树的遍历:先序,中序,后序 图的存储:邻接矩阵(不适于存储稀疏图)与邻接表

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

数据结构学习系列之线性表(三)

前言数据结构学习,发现坚持下来比较难,本次学习与上次学习间隔了几个月,不管怎样还是要强迫自己坚持下来. 静态链表 用数组模拟链式结构的线性表,对于没有指针的编程语言,只能使用这种方式来模拟.这是大师们想出来的实现方法,体会大师们的编程思路,站在大师们的肩膀上解决一个又一个的难题.每个节点包含一个游标(数组数字索引),用于指向下个节点,所以静态链表也称为游标链表.规定数组第一个元素为备用链表(未被使用的数组游标,静态链表初始化时,会生成备用链表)的头节点,数组最后一个元素为链表的头节点.当需要插入

数据结构学习系列之线性表(五)

前言 单向链表查找下一个元素很方便,要查找上一个元素时,需要从头开始向下遍历,很是麻烦.如何解决这个问题呢?使用双向链表结构可以解决这个问题. 双向链表 在单向链表的基础上,增加一个指向上一个节点的指针,这就形成了双向链表结构.因增加了一个指针域,故需要占用更多的内存空间,换就话说,用空间换时间.现在硬件越来越强,而价格越来越低,这种思想的应用案例越来越普遍. 代码实现 1 /** 2 * @desc 双向链表 3 * 4 * @date 2015/08/23 5 * @copyright by