阿摩線上測驗 登入

申論題資訊

試卷:107年 - 107 經濟部所屬事業機構_新進職員甄試_資訊:1.資訊管理、2.程式設計#79709
科目:國營事業◆1.資訊管理 2.程式設計
年份:107年
排序:0

申論題內容

六、何謂環狀佇列(Circular Queue)(4分)?請使用C、Java等程式語言或虛擬碼(Pseudo Code)以陣列 (Array)方式實作環狀佇列,其中須包含新增與刪除佇列元素之方法(20分)。

詳解 (共 3 筆)

詳解 提供者:Clown(2021上岸

#include

#define maxsize 10

using namespace std;


int cyclequeue[maxsize];

int front = 0;

int rear  = 0;

int flag  = 0; 


void insertQueue(int data){

    if(front != rear || flag == 0){

        cyclequeue[rear]= data;

        if(front == rear)

            flag = 1;    

        rear = (rear+1) % maxsize;

        printf("insert queue:%d\n", data);

    }

    else

        printf("queue full\n");

}

void deleteQueue(){

    if(front != rear || flag == 1){

        int temp = cyclequeue[front];

        front = (front +1) % maxsize;

        if(front == rear)

            flag = 0;

        printf("delete:%d\n", temp);

    }

    else

        printf("queue full\n");

}


void show(){

    int i = front;

    int turn = 0;

    while(true){

        printf("cyclequeue[%d]=%d\n", i, cyclequeue[i]);

        i= (i+1) % maxsize;

        if(i == rear)

            turn = 1;

        if(turn == 1)

            break;

    }

}


int main()

{

   for(int i = 0 ;i <= maxsize; i++){

       insertQueue(i*10);

   }

   show();

   deleteQueue();

   deleteQueue();

   deleteQueue();

   deleteQueue();

   show();

   for(int i = 0 ;i <= maxsize; i++){

       insertQueue(i*10);

   }

   show();

   return 0;

}

詳解 提供者:abaochang
加標記實作法:(因原本最多只能存放N-1筆資料,使其可存到N筆)

6184171ad2424.jpg

const int N = 100:

ItemType q[N];
int front, rear;
 
void CreateQ;
{front = rear = N-1;
Qfull=false;}
 
Boolean IsQueueEmpty()
{return (!Qfull & & front==rear);}
 
 
Boolean IsQueueFull() 
{return Qfull;} //會輸出false
 
void Enqueue(ItemType x) //加資料
{
if(IsQueueFull()){
QueueFull(); }
rear=(rear+1)%N; //加在下一個再移動
q[rear]=x;
if(rear==front){
Qfull=true; } //重要處!加完資料後發現rear=front的位置
 
 
ItemType Dequeue()
{
if (IsQueueEmpty( )) {
QueueEmpty(); }
 
front = (front + 1) % N;//front為尾巴紀錄點
Qfull=false; //做完dequeue一定也不是滿的
return q[front]; //傳回最前端資料

詳解 提供者:Fourier
參考B4大大的後發現在佇列全空的情況下會把整個陣列印出來
所以更改了一點
然後我懶惰所以基本上無法push-1進去但我也懶得處理就這樣
有問題請指教感謝
 
#include <iostream>
using namespace std;

int front = 0; // 佇列頭
int rear = 0;  // 佇列尾
int flag = 0;  // 檢查是否已滿
int array[10] = {};

void push_back(int number)
{
    if (front == rear && flag == 1)
    {
        cout << "佇列已滿" << endl;
    }
    else
    {
        cout << "插入" << number << endl;
        array[rear] = number;
        rear = (rear + 1) % 10;
        if (front == rear && flag == 0)
        {
            flag = 1;
        }
    }
}

void pop_front()
{
    if (front == rear && flag == 0)
    {
        cout << "佇列已空" << endl;
    }
    else
    {
        cout << "彈出" << array[front] << endl;
        if (front == rear && flag == 1)
        {
            flag = 0;
        }
        front = (front + 1) % 10;
    }
}

void show()
{
    int i = front, turn = 0;
    if (front == rear && flag == 0)
    {
        cout << "佇列已空" << endl;
    }
    else
    {
        while (1)
        {
            printf("array[%d]=%d\n", i, array[i]);
            if (++i > 9)
            {
                i = i % 10;
            }
            if (i == rear)
                turn = 1;
            if (turn)
                break;
        }
    }
}

int main()
{
    while (true)
    {
        cout << "輸入要做的事情(0:離開、1:push、2:pop、3:show):";
        int num;
        cin >> num;
        if (num == 0)
        {
            break;
        }
        else if (num == 1)
        {
            int temp;
            cout << "請輸入整數(輸入-1離開)";
            while (cin >> temp)
            {
                if (temp == -1)
                    break;
                else
                    push_back(temp);
            }
        }
        else if (num == 2)
        {
            pop_front();
        }
        else if (num == 3)
        {
            show();
        }
        else
        {
            cout << "輸入錯誤,請再輸入一次" << endl;
        }
    }
    return 0;
}