演算法導論 10.1-5 雙端隊列

來源:互聯網
上載者:User
一、題目棧的插入和刪除操作都是在一端進行的,而隊列的插入和刪除卻是在兩頭進行的。另有一種雙端隊列(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];}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.