資料機構(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;