天勤2022数据结构(二)栈和队列
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 基本操作
- 一、順序棧操作
- 二、鏈棧
- 三、順序隊
- 真題仿造
- 基礎題
- 總結
前言
順序棧 typedef struct{int top;int data[maxSize]; }SqStack;鏈棧結點 typedef struct LNode{int data;struct LNode *next; }LNode;順序隊列 typedef struct{int front;int rear;int data[maxSize]; }SqQueue;鏈隊列 typedef struct QNode{int data;struct QNode *next; }QNode;typedef struct{QNode *front;QNode *rear; }LiQueue基本操作
一、順序棧操作
初始化
void initStack(SqStack &st){st.top = -1; }判斷棧空
int isEmpty(SqStack st){return top == -1?1 :0; }進棧 [上溢]
[注意邊界條件!!!] 棧滿 top=maxSize-1
出棧 [下溢]
[注意邊界條件!!!] 棧空 top=-1
二、鏈棧
初始化
void initStack(LNode *&lst){lst = (LNode*)malloc(sizeof(LNode));lst -> next = NULL; }判斷棧空
void isEmpty(LNode *lst){if(lst->next == NULL)return 1;return 0; }進棧 [頭插法]
void push(LNode *&lst, int x){LNode *p = (LNode*)malloc(sizeof(LNode));p->data = x;p->next = lst->next;lst->next = p; }出棧
[釋放結點] 棧空 lst->next=NULL
三、順序隊
初始化
隊空:front=rear
判斷隊空
int isEmpty(SqQueue qu){return qu.front == qu.rear; }進隊
先移動rear,再賦值
出隊
先移動front,再賦值
真題仿造
為了充分利用空間,順序棧s0、s1共享一個存儲區elem[0,…, maxSize-1]試設計共享棧s0、s1以及有關入棧和出棧操作的算法,假設中元素為int型。要求:
給出基本設計思想
[Hint] 棧頂指針相向移動
棧底設在存儲區的兩端,即s0棧底設在下標0處,s1棧底設在下標maxSize-1處
棧頂在0~maxSize-1的范圍內變動,當兩棧棧頂相遇時為棧滿。
根據設計思想,采用C或C++語言描述算法(對于共享棧要寫出其結構定義),關鍵之處給出注釋
//共享棧棧結構體定義 typedef struct{int top[2]; // top[0]為s0棧頂,top[1]為s1棧頂int elem[maxSize]; }SqStack;// 入棧 int push(SqStack &st, int stNo, int x){ //stNo是棧的編號if(st.top[0] + 1 ==st.top[1])return 0; // 棧滿后不能入棧,返回0if(stNo == 0){++(st.top[0]);st.elem[st.top[0]] = x;return 1; // 入棧成功,返回1}else if(stNo == 1){--(st.top[1]);st.elem[st.top[1]] = x;return 1;}elsereturn -1; // 棧編號輸入有誤,返回-1 } // 出棧 int pop(SqStack &st, int stNo, int &x){if(stNo == 0 && st.top[0]!=-1){ // st0棧且不空x = st.top[0]--;return 1; // 出棧成功,返回1}else if(stNo == 1 && st.top[1]!=maxSize){ // st1棧且不空x = st.top[1]++;return 1; // 出棧成功,返回1}elsereturn 0; // 出棧錯誤,返回0; }請利用兩個棧s1和s2來模擬一個隊列,假設中元素為int型,棧中元素最多為 maxSize。已知的3個運算定義如下。
push(ST,x):元素x入ST棧
pop(ST,&x):ST棧頂元素出棧,賦給變量x
isEmpty(ST):判斷ST棧是否為空
如何利用的運算來實現該隊列的3個運算: enQueue(元素入隊列)、 deQueue(元素出隊列) isQueueEmpty(判斷隊列是否為空,空返回1,不空返回0)。要求:
(1)給出基本設計思想
s1為輸入棧:逐個元素進棧,模擬入隊
s2為輸出棧:將s1中元素退棧后逐個壓入s2棧。s1最先入棧的元素在s2中處于棧頂。s2退棧,模擬出隊
當s1,s2 均為空 時,隊列為n空
(2)根據設計思想,采用C或C++語言描述算法,關鍵之處給出注釋。
typedef struct{int data[maxSize];int top = -1; }SqStack;// 入隊 int enQueue(SqStack &s1, SqStack &s2, int x){int y; if(s1.top == maxSize-1){if(!isEmpty(s2))return 0; // s1滿,s2非空,這時s1不能再入棧,返回0else{while(!isEmpty(s1)){ //s1滿,s2空,將s1中元素逐個退棧并壓入到s2中pop(s1, y);push(s2, y);}push(s1, x);return 1;}}// s1沒有滿,直接入棧push(s1, x); return 1; }//出棧 int deQueue(SqStack &s2, SqStack &s1, int &x){if(isEmpty(s2)){if(isEmpty(s1))return -1; // 兩個棧中均無元素,隊列為空int y;while(!isEmpty(s1)){ //s2空,s1不為空,將s1中元素逐個退棧并壓入s2中pop(s1, y);push(s2, y);}pop(s2, x);return 1;}// s2不空,直接出棧pop(s2, x);return 1; }//判斷隊列是否為空 int isQueueEmpty(SqStack s1, SqStack s2){return isEmpty(s1) && isEmpty(s2); }基礎題
鐵路進行列車調度時,常把站臺設計成棧式結構,試問:
-
設有編號為1,2,3,4,5,6的6輛列車,順序開入棧式結構的站臺,則可能的出棧序列有多少種?
f(n)=1n+1C2nn=16+1C126f(n)=\frac{1}{n+1}C_{2n}^{n}=\frac{1}{6+1}C_{12}^{6}f(n)=n+11?C2nn?=6+11?C126?
-
若進站的6輛列車順序如上所述,那么是否能夠得到435612、326541、154623、135426435612、326541、154623、135426435612、326541、154623、135426的出站序列?如果不能,說明為什么不能如果能,說明如何得到(寫出進棧或出棧的序列)
不能得到:435612,154623
因為若在4,3,5,6之后再將1,2出棧,則1,2必須一直在棧中,此時1先進棧,2后進棧,2應在1的上面,不可能先于1,2。同理。
試證明:若借助可由輸入序列1,2,3,…,得到一個輸出序列p1,p2,p3,…pn(它是輸入序列的某一種排列),則在輸出序列中不可能出現以下情況:存在i,j,k,使得pj<pk<pi(提示用反證法)
必要性:
當i<j<k時,進棧順序時i,j,k,這3個元素的出棧的相對順序時pi,pj,pk。當較大的數首先出棧時,那些較小的數都是降序壓在棧內的。這些數不可能正序出棧
充分性:
如果pj<pk<pi成立,表明當i<j<k時各元素進棧、出棧后的相對順序 為pj,pk,pi
當j<k時,pj<pk,表明pj必須在pk進棧之前就出棧,否則pj就被壓在pk下面了
當i<k時,pk<pi,表明pi是先于pk進棧的
綜上所述可知,這與正確的出棧順序pi<pj<pk相矛盾
假設以I和O分別表示入棧和出棧操作。若棧的初態和終態均為空,入棧和出棧的操作序列可表示為僅由I和O組成的序列,則稱可以操作的序列為合法序列,否則稱為非法序列
-
試指出判別給定序列是否合法的一般規則
- 給定序列中,I的個數和O的個數相等
- 從給定序列的開始到給定序列的任一位置,I的個數要大于或等于O的個數
兩個不同的合法序列(對兩個具有同樣元素的輸入序列)能否得到相同的輸出元素序列?如能得到,請舉例說明
可以得到相同的輸出元素序列
例如:輸入元素為A,B,C,則兩個輸入序列A,B,C和B,A,C均可得到輸出元素序列A,B,C。對于輸入 序列A,B,C,使用IOIOIO操作序列;對于輸入序列B,A,C,使用IIOOIO操作序列
寫出一個算法,判定所給的操作序列是否合法。若合法,返回1,否則返回0(假定被判定的操作序列已存入一維char型數組ch[]中,操作序列以“\0”為結束符)
int judge(char ch[]){int i=0;int I=0,O=0;while(ch[i]!='\0'){if(ch[i]=='I')++I;if(ch[i]=='O')++O;if(O>I)return 0;++i;}if(I!=0)return 0;elsereturn 1; }有5個元素,其入棧次序為A,B,C,D,E,在各種可能的出棧次序中,以元素C,D最先出棧(C第一個且D第二個出棧)的次序有哪幾個?
寫出下列中綴表達式的后綴形式(單目運算操作,如!A的后綴表達式為A!)
A*B*C
A B*C *
-A + B - C + D
A-B+C-D+
C-A*B
CAB*-
(A+B) * D + E/(F + A * D) + C
AB+D * EFAD * +/+C+
(A&&B)||(!(E>F))
AB&& EF>! ||
(!( A&& ( ! ( ( B<C ) || ( C>D )))))||(C<E)
這里是引用
總結
總結
以上是生活随笔為你收集整理的天勤2022数据结构(二)栈和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git使用vimdiff模式比对代码
- 下一篇: 《Python程序设计(第3版)》课后习