1. 程式人生 > >資料機構(10)--順序迴圈佇列的實現及相關操作

資料機構(10)--順序迴圈佇列的實現及相關操作

參考書籍:資料結構(C語言版)嚴蔚敏吳偉民編著清華大學出版社

1.順序佇列

順序佇列的型別定義如下:
#define  maxsize 100/*佇列的最大容量*/
typedef char QElemtype;
struct  Queue
 {   QElemtype data[maxsize ];  //隊員的儲存空間
     int front;  //隊頭隊尾指標
     int rear;   //隊尾指標
 };
    定義一個順序隊的變數:      Queue  Q;
    佇列的資料區為:Q.data[0]---Q.data[maxsize -1]
    隊頭指標:Q.front    隊尾指標:Q.rear
    約定隊頭指標指向隊頭元素,隊尾指標指向隊尾元素後面一個位置(這樣的設定是為了某些運算的方便,並不是唯一的方法)。 

    從下圖中可以看到,隨著入隊出隊的進行,會使整個佇列整體向後移動,這樣就出現了圖(d)中的現象:隊尾指標已經移到了最後,再有元素入隊就會出現溢位,而事實上此時隊中並未真的“滿員”,這種現象為“假溢位”,這是由於“隊尾入隊頭出”這種受限制的操作所造成。


解決上面的問題一個巧妙的方法就是:將順序佇列臆造成一個環狀的空間,如下圖,稱之為迴圈佇列

2.順序迴圈佇列

順序迴圈佇列的定義

#define MAXSIZE 30
typedef char QElemType;
typedef struct{
QElemType data[MAXSIZE];
int f;//頭指標
int r;//尾指標
}SqQueue;


因為是頭尾相接的迴圈結構,入隊時的隊尾指標加1操作修改為:Q.rear=(Q.rear+1) % (n0+1);
出隊時的隊頭指標加1操作修改為:Q.front=(Q.front+1) % (n0+1);
設n0=9,圖是迴圈佇列操作示意圖。 


     從圖的迴圈隊可以看出,在隊空情況下有:front==rear,在隊滿情況下也有:front==rear就是說“隊滿”和“隊空”的條件是相同的了。這顯然是必須要解決的一個問題。
      方法之一是附設一個儲存隊中元素個數的變數如num,當num==0時隊空,當num==maxsize時為隊滿。
      另一種方法是少用一個元素空間,把圖(d)所示的情況就視為隊滿,此時的狀態是隊尾指標加1就會從後面趕上隊頭指標,這種情況下隊滿的條件是:(rear+1) % maxsize ==front,也能和空隊區別開。


下面的迴圈佇列及操作按第二種方法實現。
隊空:front==rear
隊滿: (rear+1) mod maxsize ==front
隊中元素個數n=(rear-front+maxsize )mod maxsize 
入隊:rear=(rear+1) % maxsize ;
出隊:front=(front+1) % maxsize ;

3.順序迴圈佇列相關操作的實現

3.1順序迴圈佇列的定義

/*順序迴圈佇列:少用一個元素空間,約定以“佇列頭指標在佇列尾指標的下一位置(環狀的下一位置)上”作為佇列“滿”狀態的標誌
即,隊滿:Q.f == (R.r + 1)%MAXSIZE
    對空:Q.f == Q.r
    隊長:(Q.r - Q.f + MAXSIZE)%MAXSIZE
    入隊時尾指標後移:Q.r = (Q.r + 1)%MAXSIZE
    出隊時頭指標後移:Q.f = (Q.f + 1)%MAXSIZE
*/
#include<stdio.h>
#define MAXSIZE 30
typedef char QElemType;
typedef struct{
	QElemType data[MAXSIZE];
	int f;//頭指標
	int r;//尾指標
}SqQueue;

3.2初始化一個空佇列

//初始化一個空佇列
void initQueue(SqQueue &Q){
	Q.f = Q.r = 0;
}

3.3求佇列長度

//求佇列長度
int getQueueLength(SqQueue Q){
	return (Q.r - Q.f + MAXSIZE)%MAXSIZE;
}

3.4入隊操作

//入隊操作,尾指標後移
void enQueue(SqQueue &Q, QElemType e){
	//先判斷佇列是否已滿
	if(Q.f == (Q.r + 1)%MAXSIZE){
		printf("佇列已滿,入隊操作失敗!\n");
		return;
	}
	Q.data[Q.r] = e;
	Q.r = (Q.r + 1)%MAXSIZE;
}

3.5出隊操作

//出隊操作,頭指標後移,e返回出隊元素值
void deQueue(SqQueue &Q, QElemType &e){
	//先判斷佇列是否為空
	if(Q.f == Q.r){
		printf("佇列已空,出隊操作失敗!\n");
		return;
	}
	e = Q.data[Q.f];
	printf("元素%c出隊\n", e);
	Q.f = (Q.f + 1)%MAXSIZE;
}

3.6利用入隊操作建立佇列

//利用入隊操作建立一個佇列,他含有n個元素
void createQueue(SqQueue &Q, int n){
	int i = 0;
	printf("請輸入%d個字元佇列元素:\n", n);
	while(i < n){
		QElemType e;
		scanf("%c", &e);
		enQueue(Q, e);
		i++;
		getchar();//吃掉回車符
	}
}

3.7列印佇列

void printQueue(SqQueue Q){
	printf("列印佇列:");
	int i = Q.f;
	while(i%MAXSIZE != Q.r){
		printf("%c ", Q.data[i]);
		i++;
	}
	printf("\n\n");
}

4.演示

void main(){
	SqQueue Q;
	initQueue(Q);
	createQueue(Q, 5);
	printQueue(Q);

	printf("執行入隊操作:");
	printf("請輸入您要入隊的字元元素:");
	QElemType e;
	scanf("%c", &e);
	enQueue(Q, e);
	printQueue(Q);

	printf("執行出隊操作:");
	deQueue(Q, e);
	printQueue(Q);

}


相關推薦

資料機構(10)--順序迴圈佇列實現相關操作

參考書籍:資料結構(C語言版)嚴蔚敏吳偉民編著清華大學出版社 1.順序佇列 順序佇列的型別定義如下: #define  maxsize 100/*佇列的最大容量*/ typedef char QElemtype; struct  Queue  {   QElemtype d

資料結構(三)——佇列實現迴圈佇列實現

一、佇列    佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇

資料結構—順序迴圈佇列(附程式碼實現

佇列 概念 佇列也是一種特殊的線性表。不過,線性表允許在任何位置插入和刪除,而佇列只允許在隊尾插入,在隊頭刪除,這樣它就具有先進先出的性質 重點 順序迴圈佇列的假溢位問題 由於隊尾

資料結構基礎8_迴圈佇列順序實現

typedef int ElemType; typedef int Status; #define true 1 #define false 0 #define maxsize 100 #include<stdio.h> #include<stdlib.h

資料結構->佇列->順序迴圈佇列ADT程式碼

順序迴圈佇列基於陣列實現時,值得注意的就是一下幾點:   1.在頭尾指標移動是不是簡單的++front/++rear;而是front=(front+1)%Qsize;   2.隊空:rear==front.   3.隊滿:front==(rear+1)%Qsize //順序迴圈隊 # inclu

資料結構_佇列-迴圈佇列實現模擬舞伴配對問題

參考《資料結構》(C語言版)主編 秦鋒和http://www.cnblogs.com/xing901022/p/3534937.html部落格,這篇部落格我認為作者介紹簡單明瞭。 採用空閒一個位置的方式,即N個元素空間的迴圈佇列最多隻能存放N-1個有效元素。1) 迴圈佇列初

資料結構之 佇列(Queue)的實現簡單操作

在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能

順序迴圈佇列的c語言實現

1. 迴圈佇列的順序儲存結構 typedef struct { QElemType data[MAXSIZE]; int front; /* 頭指標 */ int rear; /* 尾指標,若佇列不空,指向佇列尾元素的下一個位置 */ }SqQueue;

佇列定義實現迴圈佇列實現

一、佇列     佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。在佇列這種資料結構中,最先插入的元素將是最先被刪除的元素;反

C語言--迴圈佇列實現

#include <stdio.h> #include <malloc.h> #include <stdlib.h> /* 迴圈佇列 */ typedef struct Queue { int *p_base; int front; int rear; }

PHP訊息佇列實現應用:訊息佇列概念介紹

  在網際網路專案開發者經常會遇到『給使用者群發簡訊』、『訂單系統有大量的日誌需要記錄』或者在秒殺業務的時候伺服器無法承受瞬間併發的壓力。  這種情況下,我們怎麼保證系統正常有效的執行呢? 這個時候,我們可以引入一個叫『訊息佇列』的概念來解決上面的需求。 訊息佇列的概

資料結構之順序表的實現(C語言)

實現程式碼: #ifndef __LINEARLIST_H__ #define __LINEARLIST_H__ #include <malloc.h> #include <stdi

迴圈佇列實現 622.Design Circular Queue

import java.util.*; class MyCircularQueue { public int[] data; private int p_start; private int p_tail; private int k; priv

資料結構知識整理 - 迴圈佇列

主要內容 佇列的定義 迴圈佇列的儲存結構 迴圈佇列的各項操作 初始化 入隊 出隊 取隊頭元素 求佇列長度   佇列的定義 棧和佇列是兩種重要的線性結構,與一般線性表不同,它們是操作受限的特殊線性表,主要用於輔助其他資料結構的

基於 Linux 的迴圈佇列實現程式碼

/************************************************************************* > File Name: cyclequeue.c > Author: Wenfei6316 >

C++基於模版的迴圈佇列實現

近期因為要反反覆覆使用佇列,而佇列需要儲存的元素格式又千差萬別,在網上搜了下貌似雙邊佇列可以解決這個問題,但是效率有點低。於是自己寫了個基於模版的迴圈佇列實現方式,有任何不合理之處還請各位大牛輕怕。 #pragma once template<class T>

順序迴圈佇列的基本運算(C語言)

迴圈佇列sq中: 1. front(隊頭指標)指向實際佇列元素的第一個元素的前一個位置,rear(隊尾指標)指向實際佇列元素的最後一個元素位置。(可根據需要自定義) 2. 迴圈佇列中的滿並非真正意義上的

PHP訊息佇列實現應用_慕課網學習

https://blog.csdn.net/d_g_h/article/details/79643714 https://blog.csdn.net/tTU1EvLDeLFq5btqiK/article/details/80971792   目前對訊息佇列並不瞭解其原理,本篇文章主要是通過慕課

資料結構】順序棧的實現(C語言)

棧的基本概念及其描述 棧是一種特殊的線性表,規定它的插入運算和刪除運算均線上性表的同一端進行,進行插入操作和刪除操作的那一端稱為棧頂,另一端稱為棧底。 棧的插入操作和刪除操作分別稱為進棧和出棧。 FILO(First In Last Out)後進先出/先進後出 eg

利用迴圈佇列實現楊輝三角的列印

#define MAXSIZE 100 #include <iostream> using namespace std; typedef int SElemType; typedef struct { SElemType *base; int front;