1. 程式人生 > >資料結構之順序佇列(迴圈佇列)

資料結構之順序佇列(迴圈佇列)

由於佇列有元素出列,front就向後移動,所以佇列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將佇列的首尾相連線。這樣當rear移動到LENGTH時,會再從0開始迴圈。那當什麼時候佇列滿呢?當rear等於front的時候。可是佇列為空的時候也是同樣的條件,那不就沒法判斷了嗎?又有人提出了這樣的想法:犧牲一個儲存空間,front前面不存資料,當rearfront前面的時候就是滿了,如圖:

 

 當rear在front之前時,佇列中剩餘一個空間,有 LENGTH - 1個元素,所以rear也為LENGTH - 1。這時就算是佇列滿了。於是滿的判斷條件應為:(rear+1)%LENGTH == front 。

 空的判斷條件為 rear == front。

參考《資料結構》嚴蔚敏版


#include<iostream>
#include<stdio.h>
using namespace std;
#define MAXSIZE 150
typedef int ElemType;
typedef int status;
#define OK 1
#define ERROR 0
typedef struct//定義迴圈佇列的資料型別
{
    ElemType data[MAXSIZE];
    int front;//指向隊頭
    int rear;//指向隊尾的下一位
} SqQueue;

status initQueue(SqQueue &que)//迴圈佇列初始化
{
    que.rear=0;
    que.front=0;
    return OK;
}

status push(SqQueue &que,ElemType e)//入佇列,即加到隊尾
{
    if((que.rear+1)%MAXSIZE==que.front)
    {
        printf("this queue is full!\n");
        return ERROR;
    }
    que.data[que.rear]=e;
    que.rear=(que.rear+1)%MAXSIZE;
    return OK;
}

status pop(SqQueue &que)//迴圈佇列刪除隊頭元素
{
    if(que.rear==que.front)
    {
        return ERROR;
    }
    que.front=(que.front+1)%MAXSIZE;
    return OK;
}

status Empty(SqQueue que)//判斷佇列是否為空
{
    if(que.rear==que.front)
    {
        return OK;
    }
    return ERROR;
}

ElemType getTop(SqQueue que)//取得隊首元素
{
    if(que.rear==que.front)
    {
        return ERROR;
    }
    return que.data[que.front];
}

int getlength(SqQueue que)//取得佇列長度
{
    return (que.rear+MAXSIZE-que.front)%MAXSIZE;
}

status traverse(SqQueue que)//佇列的遍歷
{
    if(que.rear==que.front)
    {
        return ERROR;
    }
    int start=que.front;
    while(start!=que.rear)
    {
        printf("%d",que.data[start]);
        start=(start+1)%MAXSIZE;
    }
    return OK;
}

int main()
{
    SqQueue que;
    int tmp;
    initQueue(que);
    while(scanf("%d",&tmp)!=EOF)
    {
        push(que,tmp);
    }
    traverse(que);
    /*
    printf("\n");
    pop(que);
    pop(que);
    printf("%d %d %d\n",getTop(que),getlength(que),Empty(que));
    push(que,8);
    push(que,9);
     printf("************************\n");
    traverse(que);
     printf("(%d %d)%d %d %d\n",que.front,que.rear,getTop(que),getlength(que),Empty(que));
     */
    return 0;
}
/*
1 2 3 4 5 6
*/



相關推薦

資料結構小結——順序陣列版

何為順序表,引用百度百科中的一段話來說 順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單

python資料結構連結串列linked list

目錄 基礎 知識 1.1 連結串列的基本結構 1.2 節點類和連結串列節點的定義 1.3 順序列印和逆序列印 連結串列的基本操作 2.1 計算連結串列長度 2.2 從前,後插入資料 2.3 查詢與刪除 參考 1.基礎 知識 1.1

資料結構單鏈表C++實現

很早前就想用C++來實現那些常用的資料結構。 今天就算是個開端把。還是那句話,看的再多不如自己動手寫一遍。 按照自己的思路寫。首先你得熟悉那種結構的特點,然後才能談實現。  連結串列是一種很常用的資料結構。支援在任意地方對資料進行增刪改查。 但是不支援隨機訪問。所以複雜度

資料結構順序佇列迴圈佇列

由於佇列有元素出列,front就向後移動,所以佇列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將佇列的首尾相連線。這樣當rear移動到LENGTH時,會再從0開始迴圈。那當什麼時候佇列滿呢?當rear等於front的時候。可是佇列為空的時候也是同樣的條件

資料結構順序佇列的操作C語言

#include <stdio.h> #include <stdlib.h> #include <string.h> #define QUEUELEN 15 //資料結構的定義 typedef struct { char name[

郝斌資料結構入門---P35---佇列迴圈佇列

郝斌資料結構入門---P35---佇列 線性結構的常見應用之一:佇列(頭部刪除,尾部插入) 定義:一種可以實現“ 先進先出 ”的儲存結構,佇列類似於排隊去買票(一端入,一端出) 分類:鏈式佇列(用連結串列實現),靜態佇列(用陣列實現),靜態佇列通常都必須是迴圈佇列。

佇列——順序儲存結構及其基本運算迴圈佇列

該文章主要介紹迴圈佇列的順序儲存結構以及相關運算。 標頭檔案:CSqQueue.h template <typename T> class SqQueueClass1 //迴圈佇列類模板 { T *data; //存放隊中元素 int fr

資料結構順序佇列的實現

上一篇部落格我們講了順序棧和鏈式棧的實現,今天我們來看一下順序佇列的實現 #pragma once #include<stdio.h> #include<stdlib.h> #include<stddef.h> #def

資料結構線性表順序表,單鏈表,迴圈連結串列,雙向連結串列-- 圖書管理系統

順序表 #include <iostream> #include <cstring> #include <cstdlib>///exit()標頭檔案exit(0):正常執行程式並退出程式。exit(1):非正常執行導致退出程式 #incl

資料結構python實現雙端佇列

雙端佇列deque 雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。 雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。 程式碼實現 """雙端

實驗四:順序佇列迴圈佇列和鏈佇列

#ifndef CirQueue_H #define CirQueue_H const int QueueSize=100; //定義儲存佇列元素的陣列的最大長度 template //定義模板類CirQueue class CirQueue { publ

詳細分析棧和佇列資料結構的實現過程Java 實現

[TOC] # 棧和佇列的資料結構的實現過程(Java 實現) ## 棧的資料結構的實現 ### 棧的基礎知識回顧 1. 棧是一種**線性結構**。 2. **相比陣列,棧對應的操作是陣列的子集。** - 也就是棧可基於陣列實現,可以將棧看成一種特殊的陣列。 3. **棧只能從一端新增元素,

資料結構排序演算法五)

// 索引堆 function swap(arr, x, y) {             var temp = arr[x];         

c語言資料結構順序

c語言資料結構之順序表:     順序表的結構跟陣列比起來還是很像的,相比於連結串列,資料表的優勢主要體現在他的查詢速度上,而連結串列的優勢相反,查詢速度慢,但對於插入一個數據來說還是比較快的 下面我們就來建立一個順序表 1:定義資料型別,我定義的是一個學生的結構體型別,首

資料結構順序儲存結構線性表

順序儲存結構:元素按順序連續儲存。 一般它的定義儲存格式為: //定義資料格式 typedef struct { ElemType data[MAXSIZE]; //陣列儲存元素 int length; //線性表的長度 }Sq

資料結構圖篇2:圖的基本操作 深度和廣度遍歷

程式碼實現 main.cpp(主函式) #include <iostream> #include "CMap.h" using namespace std; /** 圖的的儲存:鄰接矩陣 圖的遍歷:深度+廣度 A / \

資料結構順序

typedef struct { int *elem; int length; }Sqlist; int InitList(Sqlist &L){ L.elem=new int [100]; if(!L.elem) return 0; L.length=0;

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

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

全面瞭解資料結構順序

此為順序表的一個C語言實現過程,其中對每一行程式碼進行了標註,同時為了方便理解順序表的儲存,邏輯與物理是相同的。也將儲存地址一同顯示出來了。 #include<stdio.h> #include<stdlib.h> #define MAX

資料結構順序表的java實現

通過查詢資料,再加上我的理解,初步建立了順序表,可以實現的功能有:查值、取值、插入、刪除。 1、建立一個介面,介面中存放你所希望的順序表所實現的功能。 public interface List1 { //線性表介面List給出了任何實現線性表功能的類中必須要