日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

天勤2022数据结构(二)栈和队列

發(fā)布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 天勤2022数据结构(二)栈和队列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 基本操作
    • 一、順序棧操作
    • 二、鏈棧
    • 三、順序隊
  • 真題仿造
  • 基礎(chǔ)題
  • 總結(jié)


前言

順序棧 typedef struct{int top;int data[maxSize]; }SqStack;鏈棧結(jié)點 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; }

進(jìn)棧 [上溢]
[注意邊界條件!!!] 棧滿 top=maxSize-1

int push(SqStack &st, int x){if(st.top == maxSize-1)return 0;st.data[++st.top] = x;return 1; }

出棧 [下溢]
[注意邊界條件!!!] 棧空 top=-1

int pop(SqStack &st, int &x){if(top == -1)return 0;x = st.data[st.top--];return 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; }

進(jìn)棧 [頭插法]

void push(LNode *&lst, int x){LNode *p = (LNode*)malloc(sizeof(LNode));p->data = x;p->next = lst->next;lst->next = p; }

出棧
[釋放結(jié)點] 棧空 lst->next=NULL

int pop(LNode *&lst, int &x){LNode *p;if(lst->next == NULL)return 0;p = lst->next;lst = lst->next->next;x = p->data;free(p);return 1; }

三、順序隊

初始化
隊空:front=rear

void initQueue(SqQueue &qu){qu.front = qu.rear = 0; }

判斷隊空

int isEmpty(SqQueue qu){return qu.front == qu.rear; }

進(jìn)隊
先移動rear,再賦值

int offer(SqQueue &qu, int x){if((qu.rear + 1)%maxSize == qu.front){return 0;}*********************************qu.rear = (qu.rear+1)%maxSize;*********************************qu.data[qu.rear] = x;return 1; }

出隊
先移動front,再賦值

int remove(SqQueue &qu, int &x){if(qu.rear == qu.front){return 0;}**********************************qu.front= (qu.front+1)%maxSize;**********************************x = qu.data[qu.front];return 1; }

真題仿造

  • 為了充分利用空間,順序棧s0、s1共享一個存儲區(qū)elem[0,…, maxSize-1]試設(shè)計共享棧s0、s1以及有關(guān)入棧和出棧操作的算法,假設(shè)中元素為int型。要求:

  • 給出基本設(shè)計思想

    [Hint] 棧頂指針相向移動
    棧底設(shè)在存儲區(qū)的兩端,即s0棧底設(shè)在下標(biāo)0處,s1棧底設(shè)在下標(biāo)maxSize-1處
    棧頂在0~maxSize-1的范圍內(nèi)變動,當(dāng)兩棧棧頂相遇時為棧滿。

  • 根據(jù)設(shè)計思想,采用C或C++語言描述算法(對于共享棧要寫出其結(jié)構(gòu)定義),關(guān)鍵之處給出注釋

    //共享棧棧結(jié)構(gòu)體定義 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來模擬一個隊列,假設(shè)中元素為int型,棧中元素最多為 maxSize。已知的3個運算定義如下。

    push(ST,x):元素x入ST棧
    pop(ST,&x):ST棧頂元素出棧,賦給變量x
    isEmpty(ST):判斷ST棧是否為空

    如何利用的運算來實現(xiàn)該隊列的3個運算: enQueue(元素入隊列)、 deQueue(元素出隊列) isQueueEmpty(判斷隊列是否為空,空返回1,不空返回0)。要求:

    (1)給出基本設(shè)計思想

    s1為輸入棧:逐個元素進(jìn)棧,模擬入隊
    s2為輸出棧:將s1中元素退棧后逐個壓入s2棧。s1最先入棧的元素在s2中處于棧頂。s2退棧,模擬出隊
    當(dāng)s1,s2 均為空 時,隊列為n空

    (2)根據(jù)設(shè)計思想,采用C或C++語言描述算法,關(guān)鍵之處給出注釋。

    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); }
  • 基礎(chǔ)題

  • 鐵路進(jìn)行列車調(diào)度時,常把站臺設(shè)計成棧式結(jié)構(gòu),試問:

    • 設(shè)有編號為1,2,3,4,5,6的6輛列車,順序開入棧式結(jié)構(gòu)的站臺,則可能的出棧序列有多少種?

      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?

    • 若進(jìn)站的6輛列車順序如上所述,那么是否能夠得到435612、326541、154623、135426435612、326541、154623、135426435612326541154623135426的出站序列?如果不能,說明為什么不能如果能,說明如何得到(寫出進(jìn)棧或出棧的序列)

      不能得到:435612,154623
      因為若在4,3,5,6之后再將1,2出棧,則1,2必須一直在棧中,此時1先進(jìn)棧,2后進(jìn)棧,2應(yīng)在1的上面,不可能先于1,2。同理。

  • 試證明:若借助可由輸入序列1,2,3,…,得到一個輸出序列p1,p2,p3,…pn(它是輸入序列的某一種排列),則在輸出序列中不可能出現(xiàn)以下情況:存在i,j,k,使得pj<pk<pi(提示用反證法)

    必要性:
    當(dāng)i<j<k時,進(jìn)棧順序時i,j,k,這3個元素的出棧的相對順序時pi,pj,pk。當(dāng)較大的數(shù)首先出棧時,那些較小的數(shù)都是降序壓在棧內(nèi)的。這些數(shù)不可能正序出棧

    充分性:
    如果pj<pk<pi成立,表明當(dāng)i<j<k時各元素進(jìn)棧、出棧后的相對順序 為pj,pk,pi
    當(dāng)j<k時,pj<pk,表明pj必須在pk進(jìn)棧之前就出棧,否則pj就被壓在pk下面了
    當(dāng)i<k時,pk<pi,表明pi是先于pk進(jìn)棧的
    綜上所述可知,這與正確的出棧順序pi<pj<pk相矛盾

  • 假設(shè)以I和O分別表示入棧和出棧操作。若棧的初態(tài)和終態(tài)均為空,入棧和出棧的操作序列可表示為僅由I和O組成的序列,則稱可以操作的序列為合法序列,否則稱為非法序列

    • 試指出判別給定序列是否合法的一般規(guī)則

    • 給定序列中,I的個數(shù)O的個數(shù)相等
    • 從給定序列的開始到給定序列的任一位置,I的個數(shù)大于或等于O的個數(shù)
    • 兩個不同的合法序列(對兩個具有同樣元素的輸入序列)能否得到相同的輸出元素序列?如能得到,請舉例說明

      可以得到相同的輸出元素序列
      例如:輸入元素為A,B,C,則兩個輸入序列A,B,C和B,A,C均可得到輸出元素序列A,B,C。對于輸入 序列A,B,C,使用IOIOIO操作序列;對于輸入序列B,A,C,使用IIOOIO操作序列

    • 寫出一個算法,判定所給的操作序列是否合法。若合法,返回1,否則返回0(假定被判定的操作序列已存入一維char型數(shù)組ch[]中,操作序列以“\0”為結(jié)束符)

      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第二個出棧)的次序有哪幾個?

  • 寫出下列中綴表達(dá)式的后綴形式(單目運算操作,如!A的后綴表達(dá)式為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)

    這里是引用

  • 總結(jié)

    總結(jié)

    以上是生活随笔為你收集整理的天勤2022数据结构(二)栈和队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: www av| 人妻少妇精品一区二区 | 国产在线综合视频 | 亚洲av无码片一区二区三区 | 亚洲乱码国产乱码精品精 | www.中文字幕在线观看 | 91福利视频网站 | 中文第一页| 国产尤物av | 欧美综合激情网 | 国内自拍在线 | 97在线超碰 | 北条麻妃二三区 | 久久精品在线 | 亚州精品国产精品乱码不99按摩 | 中文字幕乱码中文乱码777 | 国产高清视频免费观看 | 欧美 日韩 人妻 高清 中文 | 日本高清中文字幕 | 日本伦理一区二区 | 久久极品| 一区二区三区免费观看视频 | 国产乱码精品一区二三赶尸艳谈 | 成年人理论片 | 国产无遮挡裸体免费视频 | 日韩人妻精品一区二区 | 亚洲欧美强伦一区二区 | 3d动漫精品h区xxxxx区 | 成年在线视频 | 久久久资源 | 日韩一级一区 | 亚洲一区网站 | 激情五月激情 | 日本高清视频www | 69精品人人人人 | 日韩av在线播放一区 | 浴室里强摁做开腿呻吟男男 | r级无码视频在线观看 | 欧美国产三级 | 婷婷国产精品 | 嫩草天堂| 国产成人久久精品77777综合 | 无码精品黑人一区二区三区 | 北条麻妃一区二区三区 | 色综合久久久无码中文字幕波多 | 欧美一卡 | www.欧美视频 | 成人午夜毛片 | 午夜av网站 | 精品乱码一区二区三区 | 人人综合网 | 一级片免费网址 | 成年人激情网 | 欧美熟妇久久久久 | 精品国产91| 亚洲熟女综合色一区二区三区 | 国产原创视频在线观看 | 久天堂| 熟女视频一区 | 特黄一区 | 日韩av中文字幕在线免费观看 | 九色porn蝌蚪 | 在线观看污污网站 | 日韩在线观看av | 男人的天堂影院 | 91深夜视频| 成人黄网免费观看视频 | 欧美片17c07.com | 又粗又大又硬又长又爽 | 日韩av手机在线播放 | 青青草av| 最好看的2019中文大全在线观看 | 黑人干亚洲 | 国产在线一卡二卡 | av片子在线观看 | av一二三四区 | 综合色婷婷一区二区亚洲欧美国产 | 亚洲天堂网在线观看视频 | 95国产精品 | 西西人体做爰大胆gogo直播 | 日韩中文字幕二区 | 亚洲免费成人在线 | www.香蕉网 | 亚洲视频一二三四 | 少妇精品无码一区二区 | 三级影片在线播放 | 久久久综合色 | 性视频一区 | 日本三级在线视频 | 精品国产鲁一鲁一区二区张丽 | 福利小视频在线观看 | 99香蕉视频 | 日本欧美不卡 | 国产专区视频 | 超碰97在线人人 | 美女爽爽爽| 久久99久久久久久 | 好av在线| 日日日插插插 |