棧和佇列習題二

2021-09-25 23:27:45 字數 2826 閱讀 4944

目錄

一、實現乙個棧,要求實現push(入棧)、pop(出棧)、min(返回最小值)的時間複雜度為o(1) 

二、元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為 (4,5,3,2,1) 

三、乙個陣列實現兩個棧(共享棧)

:以上三個題的完整**至 github 檢視:

1、定義

思路:使用兩個棧來實現,乙個棧用來正常出入棧,另乙個棧用來存放最小值。如下圖:

2、push(入棧)思路:正常棧正常入棧即可,需注意,如果入棧元素小於最小棧的棧頂元素,那麼入棧元素也入最小棧,即最小棧的棧頂元素始終存放最小值。

void minstackpush(minstack* pms, mstdatatype d)

}

3、pop(出棧)思路:和入棧類似,正常棧正常出棧即可,需注意出棧的元素是否為最小棧中的棧頂元素,即出棧的元素是否為目前所有元素中的最小值,如果是最小值,則最小棧也出棧,如果不是,最小棧不動。 

void minstackpop(minstack* pms)

stackpop(&pms->_st);

}

4、min(返回最小值)思路:這個就很簡單,棧中最小值即最下棧的棧頂元素,直接返回最小棧中的棧頂元素即可。

mstdatatype minstackmin(minstack* pms)

思路:判斷乙個序列是否可以成為另乙個序列的出棧順序,首先,第乙個就是必須兩個序列個數相同,如果個數不同,一定不是合法順序;然後,我們需要做的就是依次比較,即入棧序列按入棧順序依次和出棧序列進行比較,不同就入棧,相同就出棧,然後出棧序列中下乙個數字與此時棧頂元素進行比較,最後只需判斷入棧序列是否為空,空則合法,非空則不合法。**如下:

// 非法 0        合法 1

int islegalstackorder(int* in, int insize, int* out, int outsize)

} if (stackempty(&st) == 0)

stackdestory(&st);

return 0;

}

思路:乙個陣列實現兩個棧,有很多種辦法,比如說,第一種辦法:將乙個陣列從中間一分為二,一半是乙個棧;第二種辦法:將陣列從頭到尾開始為第乙個棧,從尾到頭開始為第二個棧,第三種,就是奇數為存放的是第乙個棧,偶數字存放的是第二個棧。前兩種辦法都不能很好地擴容,因此我們在這裡只說第三種,即奇偶棧實現共享棧。

1、定義

#define n 100

typedef int ssdatatype;

typedef struct sharestack

sharestack;

2、入棧思路:首先判斷給哪乙個棧入棧,確定入棧的棧為哪乙個以後,先判斷這個棧是否滿了,滿了就不再入棧,直接返回,不滿就入棧,然後 top+=2 。

void sharestackpush(sharestack* pss, ssdatatype d, int which)

pss->_a[pss->_top1] = d;

pss->_top1 += 2;

} else if (which == 2)

pss->_a[pss->_top2] = d;

pss->_top2 += 2;

} else

}

3、出棧思路:與入棧思路相同,先判斷是哪個棧出棧,在判斷棧是否為空,空直接返回,不空則出棧,top-=2 。

void sharestackpop(sharestack* pss, int which)

pss->_top1 -= 2;

} else if (which == 2)

pss->_top2 -= 2;

} else

}

4、取棧頂元素思路:與之前相同,先判斷是哪個棧,再判斷是否為空,空返回  -1 ,非空,則直接返回 top 位置的元素。

ssdatatype sharestacktop(sharestack* pss, int which)

return pss->_a[pss->_top1 - 2];

} else if (which == 2)

return pss->_a[pss->_top2 - 2];

} else

}

棧和佇列習題

public class mystack 出棧操作 public integer pop 通過下標找到當前的棧頂元素 int ret elem size 1 size return ret 取棧頂元素 public integer peek return elem size 1 2 用單鏈表實現棧 ...

實驗二 棧和佇列 順序棧 順序佇列

棧是什麼?棧是一種結構,也是一種方式。棧代表著 後進先出 我是這麼理解的 如圖 就像是放在試管裡的雞蛋,新放進去的雞蛋肯定是在最上層,想拿走的話只能從最上層乙個個拿,這種方式叫做棧。棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對...

實驗二棧和佇列

一 1.順序棧 源 include const int stacksize 10 template class seqstack seqstack void push void pop datatype gettop int empty private datatype data stacksize...