栈和队列习题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈和队列习题

一:举例

.例子:对于一个栈,给出输入序列为abc,试写出全部可能的输出序列。

分析:本题有如下几种情况:

(1)a进 a出 b进 b出 c进 c出产生输出序列abc

(2) a进 a出 b进 c进 c出 b出产生输出序列acb

(3) a进 b进 b出 a出 c进 c出产生输出序列bac

(4) a进 b进 b出 c进 c出 a出产生输出序列bca

(5) a进 b进 c进 c出 b出 a出产生输出序列cba

(6) 不可能产生输出序列cab

答案:abc、acb、bac、bca、cba

.例子:利用顺序栈的基本运算,试设计一个算法,判断一个输入字符串是否具有中心对称(也就是所谓的“回文”,正读和反读均相同的字符序列),例如ababbaba,abccba都是中心对称的字符串。

算法如下:

int Symmetry()

{

SeqStack S;

int j,k,i=0;

char str[80[;

gets(str);

while(str[i]!=’\0’) i++; /*求串长度*/

for(j=0;j

push(S,str[j]); /*前一半字符入栈*/

if(i%2!=0)

k=i+1;

else

k=i;

for(j=k/2;j

if(str[j]!=pop(S)

return 0;

else

continue;

return 1;

}

二:单选题

1.按字母a,b,c,d,e顺序入栈,则出栈的输出序列不可能的是()。

A. decba B、 dceab C. abcde D.edcba

2.判断一个顺序栈st(最多元素为StackSize)为栈满的条件是()。

A. st.top!= StackSize

B. st.top!=0

C. st.top!= -1 D、st.top== StackSize-1

3.栈又称为()的线性表。

A. 顺序进出

B.后进后出

C、后进先出 D. 先进先出

4.一个队列的入队顺序是1,3,5,7,9,则出队的输出序列只能是()。

A.9,7,5,3,1 B、 1,3,5,7,9

C.1,5,9,3,7

D. 9,5,1,7,3

5. 判断一个顺序队列sq(最多元素为QueueSize)为空队列的条件是()。

A、 sq.rear=sq.front B. sq.rear=0

C. sq.front =QueueSize

D. sq.rear =QueueSize+1

6. 判断一个循环队列cq(最多元素为QueueSize)为满队列的条件是()。

A. cq.rear=cq.front

B.cq.rear= QueueSize

C、(cq.rear+1)% QueueSize=cq.front

D.cq.rear% QueueSize+1=cq.front

三:问答题

简述下面所给算法的功能是什么?(假设栈元素为整数类型)

(1) void ex31(SeqStack *S)

{

int A[80],i,n;

n=0;

while(!empty(S))

{ A[n]=pop[S];

n++;

}

for(i=0;i

push(S,A[i]);

}

答案:此算法功能是通过一个数组将一个栈中的所有元素逆置存放。例如原来栈S中存放5个元素abcde,经过算法执行后,变为edcba。

(2) void ex32(SeqStack *s,int c)

{

SeqStack T;

int d;

while(!StackEmpty(S))

{ d=pop(S);

if(d!=c) push(T,d);

}

while(!StackEmpty(T))

{ d=pop(T);

if(d!=c) push(S,d);

}

}

答案:通过一个中间栈T,达到删除栈S中所有与变量c相同的元素。

四:算法设计题

试利用循环队列(长度为k)存储,编写求斐波那契的前n(n>k)项(f0,f1,f2,…)的算法,其函数定义如下:

0 n=0

1 n=1

f(n)=

f(n-2)+f(n-1) n>=2

算法如下:

因为循环队列长度为K,所以在执行算法结束时,留在队列中的元素应是所求序列中的最后k项。由于只有k个元素空间,则在计算

fi时,队列总是处在头尾相接的状态,因此只须一个指针rear 指向当前的队尾。每次求得一个fi之后即送入(rear% k)的位置上,冲掉原来对头元素。

#define m maxlen

typedef struct{

int rear;

int data[m];

}CirQueue;

int Fibonacci(int i) //求序列的前n项算法

{ if(i == 0)

return 0;

else if(i= = 1)

return 1;

else return (Fibonacci(i-2) +Fibonacci(i-1));

}

void Fibonacci( CirQueue * Q, int k)

{

int i, n;

Q->rear = 0;

scanf(“%d” ,&n);

for(i =0; i

{ Q->rear =i;

if ( i> =k) Q->rear = Q->rear% k;

Q->data [Q->rear] = Fibonacci(i);

}

}

2.算法阅读

假设两个队列共享一个循环向量空间(参见右下图),

其类型Queue2定义如下:

typedef struct{

DateType data[MaxSize];

int front[2],rear[2];

}Queue2;

对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。请对以下算法填空,实现第i个队列的入队操作。