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...