演算法導論 10 1 5 雙端佇列

2021-06-09 14:54:57 字數 2396 閱讀 2973

棧的插入和刪除操作都是在一端進行的,而佇列的插入和刪除卻是在兩頭進行的。另有一種雙端佇列(deque),其兩端都可以做插入和刪除操作。對於乙個用陣列構造的雙端佇列,請寫出四個在兩端進行插入和刪除的操作的過程,要求執行時間都為o(1)

next(p, l)

1 if p = l

2 then ret <- 1

3 else ret <- p + 1

4 return ret

pre(p, l)

1 if p = 1

2 then ret <- l

3 else ret <- p - 1

4 return ret

dequeue-left-insert(d, x)

1 l <- pre([left[d], length[d])

2 if l = right[d]

3 then error "overflow"

4 if left[d] = right[d]

5 right[d] <- next(right[d], length[d])

6 d[left[d]] <- x

7 left[d] <- l

dequeue-right-insert(d, x)

1 r <- next([right[d], length[d])

2 if r = left[d]

3 then error "overflow"

4 if left[d] = right[d]

5 left[d] <- pre(left[d], length[d])

6 d[right[d]] <- x

7 right[d] <- r

dequeue-left-delete(d)

1 if left[d] = right[d]

2 then error "underflow"

3 ret <- d[left[d]]

4 left[d] <- next(left[d], length[d])

dequeue-right-delete(d)

1 if left[d] = right[d]

2 then error "underflow"

3 ret <- d[right]

4 right[d] <- pre(right[d], length[d])

//雙端佇列

struct deque

};//輸出雙端佇列

void print(deque d)

//同樣考慮迴圈的問題

else }

//判斷雙端佇列是否為空

bool deque_empty(deque d)

int next(int p, int l)

int pre(int p, int l)

//左端插入

void deque_left_insert(deque &d, int x)

//如果初始化時為空,兩端的指標都要移動

if(d.left == d.right)

d.right = next(d.right, d.length);

d.s[d.left] = x;

d.left = l;

}//右端插入,處理方式類似左端插入

void deque_right_insert(deque &d, int x)

if(d.left == d.right)

d.left = pre(d.left, d.length);

d.s[d.right] = x;

d.right = r;

}//左端刪除

int deque_left_delete(deque &d)

d.left = next(d.left, d.length);

//如果刪除時只有乙個元素,刪除後兩端的指標都要移動

if(next(d.left,d.length) == d.right)

d.right = d.left;

return d.s[d.left];

}//右端刪除,處理類似左端刪除

int deque_right_delete(deque &d)

d.right = pre(d.right, d.length);

if(next(d.left,d.length) == d.right)

d.left = d.right;

return d.s[d.right];

}

佇列 雙端佇列

1.佇列 佇列是遵循先進先出 fifo,也稱為先來先服務 原則的一組有序的項。佇列在尾部新增新 元素,並從頂部移除元素。最新新增的元素必須排在佇列的末尾 class queue 向佇列新增元素 enqueue element 檢查佇列是否為空並獲取它的長度 isempty 從佇列移除元素 deque...

雙端佇列 Acwing 134 雙端佇列

達達現在碰到了乙個棘手的問題,有n個整數需要排序。達達手頭能用的工具就是若干個雙端佇列。她從1到n需要依次處理這n個數,對於每個數,達達能做以下兩件事 1 新建乙個雙端佇列,並將當前數作為這個佇列中的唯一的數 2 將當前數放入已有的佇列的頭之前或者尾之後。對所有的數處理完成之後,達達將這些佇列按一定...

演算法整理 複習 佇列 單調佇列 雙端佇列

這裡說一下,佇列中全部是元素從隊尾進 rear 隊頭出 head 左開右閉區間,即 rear 所指的位置是包含在佇列中的,head 所指的位置不在佇列中,所以 rear head 時隊列為空。我也分不太清應該是從隊尾進還是隊頭進比較合適,但是也不是什麼大問題,畢竟只是個變數名的問題,封裝好後並不會有...