数据结构_队列(queue)

来源:互联网 发布:java视频播放框架 编辑:程序博客网 时间:2024/06/06 04:03

队列:就是生活中的排队,因此排队是先到先得,也是先离开队伍,因此队列也是采用的先进先出的概念(FIFO,慢慢想想操作系统里面是不是也用到FIFO,自己去查吧 到底有没有)。如何能够准确的定位是先进先出呢,因此采用的就是头指针front和尾指针rear,通常这两个指针是封装成一个链队;注意front与rear是节点的数据类型哦~~~~~~

先来看看顺序队列吧:

<span style="font-size:12px;">#define MAXSIZEtypedef  struct{   DataType  data[MAXSIZE];   int front, rear;}Sequeue;//定义一个指向队列的指针变量,并申请存储空间Sequeue  * sq = new Sequeue;//队列的数据区域sq->data[0] ~ sq->data[MAXSIZE - 1];//为空队时:sq->front = sq->rear = -1;//入队操作sq->rear++;sq->data[sq->rear] = x;//出队操作sq->front++;x = sq->data[sq->front]</span>
但是上面的这种会出现一种现象,就是当一个队列又有出队又有入队时,出了队的存储空间不能再次作为入队所需的存储空间,这种就是本来对没有满,但是不能继续入队,这种现象就称为假溢出的现象;为了解决这种现象,因此提出了循环队列,也就是将出了队的空间再次利用作为新入队元素的所需空间。
<span style="font-size:12px;">到底应该如何才可以将队循环呢?其实就是尾指针与头指针进行循环加1//入队sq->rear = (sq->rear + 1)%MAXSIZE;//出队sq->front = (sq->front + 1)%MAXSIZE;但是这种做法就会出现另外一个问题,那就是队列为NUL和满队时都是sq->rear = sq - >front;这样就傻傻的分不清楚到底是哪种情况。解决方案:1:就是牺牲一个存储空间,让这个空间不存储东西,此时满队的条件就是(rear + 1)%MAXSIZE = font;2:就是定义个变量标识,当标识等于0表示空队列,等于MAXSIZE表示队满。</span>

链队:
<span style="font-size:12px;">typedef struct node{int data;struct node * next;}QNode;  //链队节点类型typedef struct {QNode * front, * rear; //将头指针与尾指针封装在一起的链队}LQueue;//带头结点的队列LQueue * Init_LQueue(){LQueue  * head= new LQueue; QNode * head_node = new QNode;head_node ->next = NULL;//将头指针与尾指针都指向头结点head->front = head_node;head->rear = head_node;return head;}//入队操作void Push_Queue(LQueue * head, int value){QNode * temp = new QNode;temp->data = value;temp->next = NULL;//将上次的队尾指针域指向新申请的节点head->rear->next = temp;//重新指定队尾指针指向的对象head->rear = temp;}//判断队是否是空int Empty_Queue(LQueue * head){if(head->front == head->rear){return 1;}elsereturn 0;}//出队操作void Pop_Queue(LQueue * head, int * returnValue){QNode * temp;if(Empty_Queue(head) == 1){cout<<"队列为空"<<endl;return;}*returnValue = head->front->next->data;//跳过头结点,取出第一个元素节点temp = head->front->next;head->front->next = temp->next;delete temp;//特别注意,如果只有一个元素时,出队后队尾指针必然会出错,因为它现在不知道应该指向哪里,所以有修改其if(head->front->next = NULL){head->rear = head->front;}}</span>

面试题1:

如果按照index访问item并就地插入或删除数据,这种操作比较繁琐,那使用什么节构最节省时间?   AA.  sequential list顺序表(数组)B.  Double linked list(双向链表)C.  Double linked list with header pointer(单独存储head指针的双向链表)D.  Linked list(链表)面试题2:编程实现队列的入队和出队操作typedef  struct student {int data;struct student * next;}node;typedef struct linkqueue{node * first, *rear;}queue;//队列的入队(这是不带头结点的操作)queue * insert(queue * HQ, int x){node * s = new node;s->data  = x;s->next = NULL;if(HQ->rear == NULL){HQ->first = HQ->rear = s;}else{HQ->rear->next = s;HQ->rear = s;}return HQ;}//出队queue * del(queue * HQ, int * x){node * p; if(HQ->first == NULL){cout<<"yichu";}else{*x = HQ->first->data;p = HQ->first;if(HQ->first == HQ->rear)//只有一个元素时{HQ->first = HQ->rear = NULL;}else {HQ->first = HQ->first->next;delete p;}}return HQ;}

哎~~~,身心疲惫啊~~~~~~~~


0 0
原创粉丝点击