PTA 雙端佇列 資料結構

2021-10-24 23:26:32 字數 2598 閱讀 3279

push

(x,d):將元素x插入到雙端佇列d的頭;

pop(d):刪除雙端佇列d的頭元素,並返回;

inject

(x,d):將元素x插入到雙端佇列d的尾部;

eject

(d):刪除雙端佇列d的尾部元素,並返回。

函式介面定義:

bool push

( elementtype x, deque d )

;elementtype pop

( deque d )

;bool inject

( elementtype x, deque d )

;elementtype eject

( deque d )

;

其中deque結構定義如下:

typedef

int position;

typedef

struct qnode *ptrtoqnode;

struct qnode

;typedef ptrtoqnode deque;

注意:push和inject應該在正常執行完操作後返回true,或者在出現非正常情況時返回false。當front和rear相等時隊列為空,pop和eject必須返回由裁判程式定義的error。

裁判程式

#include

#include

#define error -1

typedef

int elementtype;

typedef

enum

operation;

typedef

enum

bool;

typedef

int position;

typedef

struct qnode *ptrtoqnode;

struct qnode

;typedef ptrtoqnode deque;

deque createdeque

(int maxsize )

bool push

( elementtype x, deque d )

;elementtype pop

( deque d )

;bool inject

( elementtype x, deque d )

;elementtype eject

( deque d )

;operation getop()

;/* 裁判實現,細節不表 */

void

printdeque

( deque d )

;/* 裁判實現,細節不表 */

intmain()

}return0;

}/* 你的**將被嵌在這裡 */

解題思路:

push和pop屬於在頭部進行操作

inject和eject屬於在尾部進行操作

push和inject需要考慮佇列是否滿了

(d->front - d->rear + d->maxsize) % d->maxsize == 1

然後注意因為相當於迴圈佇列所以head和rear插元素時要注意移動方式

pop和eject需要考慮是否為空,這比較簡單直接判斷收尾指標是否相等即可

另一方面注意讀題:為區分空佇列和滿佇列,需要多開闢乙個空間

個人認為難點在於位置的移動與情況的判斷

附上程式:

bool push

(elementtype x, deque d)

d->front =

(d->front -

1+ d->maxsize)

% d->maxsize;

d->data[d->front]

= x;

return true;

}elementtype pop

(deque d)

num = d->data[d->front]

; d->front =

(d->front +1)

% d->maxsize;

return num;

}bool inject

(elementtype x, deque d)

d->data[d->rear]

= x;

d->rear =

(d->rear +1)

% d->maxsize;

return true;

}elementtype eject

(deque d)

num = d->data[

(d->rear -

1+ d->maxsize)

% d->maxsize]

; d->rear =

(d->rear -

1+ d->maxsize)

% d->maxsize;

return num;

}

資料結構 佇列 雙端佇列

佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出 first in first out 的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為對頭。佇列不允許在中間部位進行操作。假設佇列是q 那麼a1就是對頭元素,而an是隊尾元素。這樣我們就可...

PTA 雙端佇列

一.定義 雙端佇列是限定插入和刪除操作在表的兩端進行的線性表,是一種具有佇列和棧的性質的資料結構。雙端佇列中的元素可以從兩端進隊和出隊,其限定插入和刪除操作在表的兩端進行。push x,d 將元素x插入到雙端佇列d的頭 pop d 刪除雙端佇列d的頭元素,並返回 inject x,d 將元素x插入到...

資料結構之雙端佇列

摘要 有時候乙個佇列可能需要能從兩端進出,這時候稱呼它為雙端佇列。具體思路很簡單,從 可以直接看出來。include stdafx.h include malloc.h include stdlib.h typedef struct dequeuerecord queue struct dequeu...