1、3.1 有 5 个元素,其进栈次序为:A 、B 、C 、D、E,在各种可能的出栈次序中,以元素C、D 最先出栈(即 C 第一个且 D 第二个出栈)的次序有哪几个?(1)B 出栈,A 出栈,E 进栈,E 出栈,输出序列为 CDBAE;(2)B 出栈,E 进栈,E 出栈,A 出栈,输出序列为 CDBEA;(3)E 进栈,E 出栈,B 出栈,A 出栈,输出序列为 CDEBA。所以可能的次序有:CDBAE、CDBEA、CDEBA。3.2 假设以 I 和 O 分别表示进栈和出栈操作,栈的初态和终栈均为空,进栈和出栈的操作序列可表示为仅由 I 和 O 组成的序列。(1)下面所示的序列中哪些是合法的?A.I
2、OIIOIOO B.IOOIOIIO C.IIIOIOIO D.IIIOOIOO(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。若合法返回 1;否则返回 0。 (假设被判定的操作序列已存入一维数组中) 。1) A、D 均合法2)运行结果:核心代码:bool Judge(char a,int n)LiStack *s;InitStack(s);int i=0;char e;bool match=true;while(i2 ) /利用 ASCII 的值判断match=false;elsePop(st,e);elsematch=false;i+;if(!StackEmpty(st)
3、match=false;DestroyStack(st);return match;3.4 设从键盘输入一整数序列 a1,a2,.an,试编程实现:当 ai0时,ai 进队,当 ai#include#include#define MAXSIZE 3typedef int ElemType;typedef structElemType dataMAXSIZE;int front,rear;Queue;void InitQueue(Queue *s-front=s-rear=0;void DestroyQueue(Queue *bool QueueEmpty(Queue *q)return (q-
4、front=q-rear);bool enQueue(Queue *q-rear=(q-rear+1)%MAXSIZE;q-dataq-rear=e;/ printf(“rear=%d “,q-rear);return true;bool deQueue(Queue *s-front=(s-front+1)%MAXSIZE;e=s-datas-front;/ printf(“front=%d“,s-front);return true;void DisplayQueue(Queue *s)while(s-front!=s-rear)s-front=(s-front+1)%MAXSIZE;pri
5、ntf(“%d “,s-datas-front);int main()int a;int n,i=0,j=0;Queue *s;InitQueue(s);while(1)a=0;printf(“请输入一个整数 “);scanf(“%d“,if(a0)if(!enQueue(s,a)printf(“错误!队满了 n“);elseprintf(“进队成功! n“);if(a=0)break;if(a0)if(!deQueue(s,j)printf(“错误!队空了 n“);elseprintf(“出队成功 n“);DisplayQueue(s);return 0;3.6 输入 n(由用户输入)个 10 以内的数,每输入 i(0i 9) ,就把它插入到第 i 号队列中。最后把 10 个队中非空队列,按队列号从小到大的顺序串接成一条链,并输出该链的所有元素。