一、題目棧的插入和刪除操作都是在一端進行的,而隊列的插入和刪除卻是在兩頭進行的。另有一種雙端隊列(deque),其兩端都可以做插入和刪除操作。對於一個用數組構造的雙端隊列,請寫出四個在兩端進行插入和刪除的操作的過程,要求已耗用時間都為O(1)二、虛擬碼
NEXT(p, l)1 if p = l2 then ret <- 13 else ret <- p + 14 return retPRE(p, l)1 if p = 12 then ret <- l3 else ret <- p - 14 return retDEQUEUE-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]] <- x7 left[D] <- lDEQUEUE-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]] <- x7 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{//左端指標和右端指標都是指向待操作元素的下一個位置int left;//左端指標,初始化為1int right;//右端指標,初始化為1int length;//數組長度int *s;//數組deque(int size):left(1),right(1),length(size){s = new int[size+1];}};//輸出雙端隊列void Print(deque D){int i;if(D.right >= D.left){for(i = D.left+1; i < D.right; i++)cout<<D.s[i]<<' ';cout<<endl;}//同樣考慮迴圈的問題else{for(i = D.left + 1; i <= D.length; i++)cout<<D.s[i]<<' ';for(i = 1; i < D.right; i++)cout<<D.s[i]<<' ';cout<<endl;}}//判斷雙端隊列是否為空白bool Deque_Empty(deque D){if(D.left == D.right)return 1;return 0;}//因為要處理迴圈,為了方便,把求下一個位置和上一個位置的函數提取出來int Next(int p, int l){if(p == l)return 1;else return p+1;}int Pre(int p, int l){if(p == 1)return l;elsereturn p - 1;}//左端插入void Deque_Left_Insert(deque &D, int x){//處理越界int l = Pre(D.left, D.length);if(l == D.right){cout<<"error:overflow"<<endl;return ;}//如果初始化時為空白,兩端的指標都要移動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){int r = Next(D.right, D.length);if(r == D.left){cout<<"error:overflow"<<endl;return ;}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){//下溢if(D.left == D.right){cout<<"error:underflow"<<endl;return -1;}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){if(D.left == D.right){cout<<"error:underflow"<<endl;return -1;}D.right = Pre(D.right, D.length);if(Next(D.left,D.length) == D.right)D.left = D.right;return D.s[D.right];}