數(shù)據(jù)結(jié)構(gòu)(三):棧與隊(duì)列

3.1?若按教科書(shū)3.1.1節(jié)中圖3.1(b)所示鐵道進(jìn)行車(chē)廂調(diào)度(注意:兩側(cè)鐵道均為單向行駛道),則請(qǐng)回答:

(1) 如果進(jìn)站的車(chē)廂序列為123,則可能得到的出站車(chē)廂序列是什么?

(2) 如果進(jìn)站的車(chē)廂序列為123456,則能否得到435612和135426的出站序列,并請(qǐng)說(shuō)明為什么不能得到或者如何得到(即寫(xiě)出以‘S’表示進(jìn)棧和以‘X’表示出棧的棧操作序列)。

可分為五種情況:

(1):1、2、3進(jìn),再3、2、1出,即321;

(2):1進(jìn),1出;2進(jìn),2出;3進(jìn)、3出,即123;

(3):1進(jìn),2進(jìn),2出,1出,3進(jìn)3出,即213;

(4):1進(jìn),1出,2進(jìn),3進(jìn),3出,2出,即132

(5):1進(jìn),2進(jìn),2出,3進(jìn),3出,1出,即231;

也可以反過(guò)來(lái)思考這個(gè)問(wèn)題:排列組合總共有6種情況,其中只有312不可能,因?yàn)?進(jìn)棧必然有1、2也進(jìn)棧,只會(huì)有321的情況。

3.2?簡(jiǎn)述棧和線(xiàn)性表的差別。

3.3?寫(xiě)出下列程序段的輸出結(jié)果(棧的元素類(lèi)型SElemType為char)。

void main()

{

Stack S;

char x, y;

InitStack(S);

x = ’c’; y = ’k’;

Push(S, x); Push(S, ‘a(chǎn)’); Push(S, y); Pop(S, x);

Push(S,‘t’); Push(S, x); Pop(S, x); Push(S,‘s’);

while(!StackEmpty(S))

{

Pop(S,y);

printf(y);

}

printf(x);

}

結(jié)果輸出:stack

棧是先進(jìn)后出。

Push(S,x); Push(S, ‘a(chǎn)’); Push(S,y); 推進(jìn)去c a k,棧內(nèi)容c a k

Pop(S,x); Push(S, ‘t’); Push(S,x); 推出k,x=k 棧內(nèi)容c a;推進(jìn)t, 站內(nèi)容c a t; 推入x=k,棧內(nèi)容 catk

Pop(S,x); Push(S, ‘s’); 推出k, x=k 棧內(nèi)容cat,推進(jìn)s,棧內(nèi)容cats

下面循環(huán)打印stac,

最后printf(x),即打印k

3.4?簡(jiǎn)述以下算法的功能(棧的元素類(lèi)型SElemType為int)。

(1)status algo1(Stack S)

{

int i, n, A[255];

n=0;

while(!StackEmpty(S))

{

n++; Pop(S, A[n]);

}

for(i=1; i<=n; i++)

Push(S, A[i]);

}

status algo1(Stack s){

//定義函數(shù) algo1, 參數(shù)為Stack類(lèi)型,返回值status類(lèi)型

int i,n ,A[255]; //定義變量

n=0;

while (!StackEmpty(s)) {

n++;

Pop(S,A[n]);

}

//如果棧不空,棧頂元素出棧,放在A[n]里面,n++,指向數(shù)組下一個(gè)位置,同時(shí)記錄了個(gè)數(shù)

for (i=1,i<=n;i++)

push(S,A[i];

//將出棧的所有元素再入棧

}

(2)status algo2(Stack S,int e)

{

Stack T; int d;

InitStack(T);

while(!StackEmpty(S))

{

Pop(S, d);

if(d!=e)

Push(T, d);

}

while(!StackEmpty(T))

{

Pop(T, d);

Push(S, d);

}

void algo2 (Stack S,int e){

Stack T, int d;

InitStack(T);

//初始化棧T

while(!StackEmpty(S)){

//循環(huán)條件:如果棧S不為空

Pop(S,d);

//S最頂元素出棧

if(d!=e) Push(T,d);

//若d!=e,就將d賦給棧T

}

while(!StackEmpty(T)){

//循環(huán)條件:如果棧T不為空

Pop(T,d);

//T最頂元素出棧

Push(S,d);

//將d賦給棧T

}

}

綜上所述:該代碼的作用是 將棧S中不等于e的元素賦給棧T,然后將棧T中的元素賦給S;所以總功能是清除棧S中等于e的元素 }

3.5?假設(shè)以S和X分別表示入棧和出棧的操作,則初態(tài)和終態(tài)均為空棧的入棧和出棧的操作序列可以表示為僅由S和X組成的序列。稱(chēng)可以操作的序列為合法序列(例如,SXSX為合法序列,SXXS為非法序列)。試給出區(qū)分給定序列為合法序列或非法序列的一般準(zhǔn)則,并證明:兩個(gè)不同的合法(棧操作)序列(對(duì)同一輸入序列)不可能得到相同的輸出元素(注意:在此指的是元素實(shí)體,而不是值)序列。

3.6? 試證明:若借助棧由輸入序列12…n得到的輸出序列為p1p2…pn(它是輸入序列的一個(gè)排列),則在輸出序列中不可能出現(xiàn)這樣的情形:存在著i

3.7?按照四則運(yùn)算加、減、乘、除和冪運(yùn)算(↑)優(yōu)先關(guān)系的慣例,并仿照教科書(shū)3.2節(jié)例3-2的格式,畫(huà)出對(duì)下列算術(shù)表達(dá)式求值時(shí)操作數(shù)棧和運(yùn)算符棧的變化過(guò)程:

A-B×C/D+E↑F

3.8?試推導(dǎo)求解n階梵塔問(wèn)題至少要執(zhí)行的move操作的次數(shù)。

3.9?試將下列遞推過(guò)程改寫(xiě)為遞歸過(guò)程。

void ditui(int n)

{

int i;

i = n;

while(i>1)

cout<

}

3.10?試將下列遞歸過(guò)程改寫(xiě)為非遞歸過(guò)程。

void test(int &sum)

{

int x;

cin>>x;

if(x==0)

sum=0;

else

{

test(sum);

sum+=x;

}

cout<

}

3.11?簡(jiǎn)述隊(duì)列和堆棧這兩種數(shù)據(jù)類(lèi)型的相同點(diǎn)和差異處。

3.12?寫(xiě)出以下程序段的輸出結(jié)果(隊(duì)列中的元素類(lèi)型QElemType為char)。

void main()

{

Queue Q;

InitQueue(Q);

char x= ‘e’, y= ‘c’;

EnQueue(Q, ‘h’);

EnQueue(Q, ‘r’);

EnQueue(Q, y);

DeQueue(Q, x);

EnQueue(Q, x);

DeQueue(Q, x);

EnQueue(Q, ‘a(chǎn)’);

While(!QueueEmpty(Q))

{

DeQueue(Q,y);

cout<

}

cout<

}

首先要明白隊(duì)列是 先進(jìn)先出

InQueue(Q,'H');

InQueue(Q,'R');

InQueue(Q,y);

//現(xiàn)在隊(duì)列內(nèi)容從前到后依次是HRC

OutQueue(Q,x);InQueue(Q,x);

//,H 出隊(duì)列,并且把H賦于x,然后x='H' 入隊(duì)列,現(xiàn)在隊(duì)列內(nèi)容從前到后依次是RCH

OutQueue(Q,x);InQueue(Q,'A');

//,R 出隊(duì)列,并且把H賦于x,注意現(xiàn)在x=‘R’,因?yàn)樽詈筝敵龅膞,就是R;然后 'A' 入隊(duì)列,現(xiàn)在隊(duì)列內(nèi)容從前到后依次是CHA

while(!QEmpty(Q))

{OutQueue(Q,y);

printf(y);

}

//這個(gè)循環(huán)依次輸出CHA

printf(x);

//輸出R

3.13?簡(jiǎn)述以下算法的功能(棧和隊(duì)列的元素類(lèi)型均為int)。

void algo3(Queue &Q)

{

Stack S;

int d;

InitStack(S);

while(!QueueEmpty(Q))

{

DeQueue(Q, d);

Push(S, d);

}

while(!StackEmpty(S))

{

Pop(S, d);

EnQueue(Q, d);

}

}

3.14?若以1234作為雙端隊(duì)列的輸入序列,試分別求出滿(mǎn)足以下條件的輸出序列:

(1) 能由輸入受限的雙端隊(duì)列得到,但不能由輸出受限的雙端隊(duì)列得到的輸出序列。

(2) 能由輸出受限的雙端隊(duì)列得到,但不能由輸入受限的雙端隊(duì)列得到的輸出序列。

(3) 既不能由輸入受限的雙端隊(duì)列得到,也不能由輸出受限的雙端隊(duì)列得到的輸出序列。

算法設(shè)計(jì)部分正在研究,希望大家多多指教

題目轉(zhuǎn)載自:迷路的國(guó)王 - 博客園,但是他的題目答案實(shí)在是簡(jiǎn)略,我又自己重新寫(xiě)了做了一遍

數(shù)據(jù)結(jié)構(gòu)非常重要,溫故而知新,必有新的收獲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.把二元查找樹(shù)轉(zhuǎn)變成排序的雙向鏈表 題目: 輸入一棵二元查找樹(shù),將該二元查找樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。 要求不...
    曲終人散Li閱讀 3,520評(píng)論 0 19
  • 課程介紹 先修課:概率統(tǒng)計(jì),程序設(shè)計(jì)實(shí)習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì),編譯原理,操作系統(tǒng),數(shù)據(jù)庫(kù)概論,人...
    ShellyWhen閱讀 2,478評(píng)論 0 3
  • 人間四月芳菲盡,正值櫻花爛漫時(shí)。滿(mǎn)山遍野的粉紅,映入眼簾。一條條櫻花之路也被寫(xiě)成了最美的詩(shī)行;一群群看花之人也定格...
    雪上陽(yáng)光閱讀 439評(píng)論 4 3
  • 早上起的較早,盡管昨天睡的很晚。一早便告知胡欣我的想法,現(xiàn)已堅(jiān)決不買(mǎi)房了。做了一些工作,卡在了一處。晚上出去散歩,...
    小王加油啊閱讀 238評(píng)論 0 0
  • “總有一個(gè)人偷偷喜歡你?!?前些日子瀏覽網(wǎng)頁(yè),突然竄出這句話(huà),不由感慨頗深。 有人說(shuō):得不到的往往是最珍貴的。 可...
    高白牧閱讀 297評(píng)論 2 1

友情鏈接更多精彩內(nèi)容