棧的插入和刪除操作都是在一端進行的,而佇列的插入和刪除卻是在兩頭進行的。另有一種雙端佇列(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 時隊列為空。我也分不太清應該是從隊尾進還是隊頭進比較合適,但是也不是什麼大問題,畢竟只是個變數名的問題,封裝好後並不會有...