1. 程式人生 > >佇列(FIFO)先進先出

佇列(FIFO)先進先出

首先引用《啊哈演算法》中的一個題,背景就不說了。大體意思就是輸入一串數字首先將第一個數字刪除,然後將第二個數放在末尾。依次迴圈,最後按照刪除的順序,把這些數連起來。

這裡然後引入佇列這個概念,佇列是一種特殊的線性結構,只允許在佇列的首部進行刪除操作->出隊,而在尾部進行插入操作->入隊,當佇列為空時,稱為空佇列。

佇列的三個基本元素(一個數組,兩個變數)

其次說一下這個題的程式碼:

#include<iostream>
using namespace std;
int main()
{
    int q[102]= {0,6,3,1,7,5,8,9,2,4},head,tail;
    head=1;
    tail=10;
    while(head<tail)
    {
        cout<<q[head]<<" ";
        head++;
        q[tail]=q[head];
        head++;
        tail++;
    }
    return 0;
}

首先解釋一下程式碼的意思。第一步,定義一個頭部和尾部。第一個數是被刪除的,所以將第一個數輸出。其次,在佇列不是空佇列的前提下執行,將第一個數輸出後,頭部往後移動一位。然後再將頭部的值付給尾部,然後頭部再加1,然後再進行迴圈。直到為空佇列時停止。‘

一共有九個數(0不計算在內),定義尾部為第十位,這樣可以防止頭部和尾部重合時仍有數沒有輸出,這樣的話就可以直接當head和tail重合時,直接停止執行,而不會對結果有影響。

然後用結構體來做這個題

#include<iostream>
using namespace std;

struct queue
{
    int data[1000];
    int tail;
    int head;
};

int main()
{
    int i;
    struct queue q;
    q.head=1;
    q.tail=1;
    for(i=1; i<=9; i++)
    {
        cin>>q.data[q.tail];
        q.tail++;
    }
    while(q.head<q.tail)
    {
        cout<<q.data[q.head]<<" ";
        q.head++;
        q.data[q.tail]=q.data[q.head];
        q.tail++;
        q.head++;
    }
    return 0;
}
 

一開始首先定義一個結構體,  int data[1000];(陣列) int tail;(尾部) int head;(頭部)。然後就是輸入數字了,這個和第一種的方法相同,就不多進行贅述了。

不過用結構體有幾個注意點。1,當訪問結構體內部變數時,可以使用“.",這個小東西叫做成員運算子或者點號運算子。然後main函式裡面時,一定要注意一定要注意一定要注意帶上結構體,剛才在打的時候數組裡面總是忘記加上"q."這個一定要注意。