数据结构(C语言版)例题(第三章:栈和队列)

合集下载

数据结构第三章栈和队列3习题

数据结构第三章栈和队列3习题

第三章栈和队列试题一、单项选择题1.栈的插入和删除操作在()进行。

A. 栈顶B. 栈底C. 任意位置D. 指定位置2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。

A. top++;B. top--;C. top = 0;D. top;3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。

A. 3, 2, 1B. 2, 1, 3C. 3, 1, 2D. 1, 3, 24.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。

A. 前一个B. 后一个C. 当前D. 后面5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。

A. n-2B. n-1C. nD. n+16.从一个顺序存储的循环队列中删除一个元素时,需要()。

A. 队头指针加一B. 队头指针减一C. 取出队头指针所指的元素D. 取出队尾指针所指的元素7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front+1 == rearB. rear+1 == frontC. front == 0D. front == rear8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front == rearB. front != NULLC. rear != NULLD. front == NULL9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

若想在链式栈的栈顶插入一个由指针s所指的结点,则应执行操作()。

A. top->link = s;B.s->link = top->link; top->link = s;C. s->link = top; top = s;D. s->link = top; top = top->link;10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

数据结构(C语言版)第三四章习题答案(可编辑修改word版)

数据结构(C语言版)第三四章习题答案(可编辑修改word版)

第3 章栈和队列习题1.选择题(1)若让元素1,2,3,4,5 依次进栈,则出栈次序不可能出现在()种情况。

A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1 (2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi 为()。

A.i B.n-i C.n-i+1 D.不确定(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。

A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n (4)链式栈结点为:(data,link),top 指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x 中,则应执行操作()。

A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link;D.x=top->link;(5)设有一个递归算法如下int fact(int n) { //n 大于等于0if(n<=0) return 1;else return n*fact(n-1); }则计算fact(n)需要调用该函数的次数为()。

A.n+1 B.n-1 C.n D.n+2 (6)栈在()中有所应用。

A.递归调用 B.函数调用 C.表达式求值 D.前三个选项都有(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。

主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。

该缓冲区的逻辑结构应该是()。

A.队列B.栈C.线性表D.有序表(8)设栈S 和队列Q 的初始状态为空,元素e1、e2、e3、e4、e5 和e6 依次进入栈S,一个元素出栈后即进入Q,若6 个元素出队的序列是e2、e4、e3、e6、e5 和e1,则栈S 的容量至少应该是()。

《数据结构》习题集:第3章栈和队列

《数据结构》习题集:第3章栈和队列

《数据结构》习题集:第3章栈和队列第3章栈和队列一、选择题1.栈结构通常采用的两种存储结构是()。

A、顺序存储结构和链表存储结构B、散列和索引方式C、链表存储结构和数组D、线性链表结构和非线性存储结构2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是()A、ST.top-ST.base<>0B、ST.top-ST.base==0C、ST.top-ST.base<>nD、ST.top-ST.base==n3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行()A、HS->next=s;B、s->next=HS->next;HS->next=s;C、s->next=HS;HS=s;D、s->next=HS;HS=HS->next;4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行()A 、x=HS;HS=HS->next;B 、HS=HS->next;x=HS->data;C 、x=HS->data;HS=HS->next;D 、s->next=Hs;Hs=HS->next;5.表达式a*(b+c)-d 的后缀表达式为()A、abcdd+-B、abc+*d-C、abc*+d-D、-+*abcd6.中缀表达式A-(B+C/D)*E 的后缀形式是()A、AB-C+D/E*B、ABC+D/E*C、ABCD/E*+-D、ABCD/+E*-7.一个队列的入列序列是1,2,3,4,则队列的输出序列是()A、4,3,2,1B、1,2,3,4C、1,4,3,2D、3,2,4,18.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为空的条件是()A、Q.rear-Q.front==nB、Q.rear-Q.front-1==nC、Q.front==Q.rearD、Q.front==Q.rear+19.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为满的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为()A、1,5B、2, 4C、4,2D、5,111.用单链表表示的链式队列的队头在链表的()位置A、链头B、链尾C、链中12.判定一个链队列Q(最多元素为n 个)为空的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n13.在链队列Q 中,插入s 所指结点需顺序执行的指令是()A 、Q.front->next=s;f=s;B 、Q.rear->next=s;Q.rear=s;C 、s->next=Q.rear;Q.rear=s;D 、s->next=Q.front;Q.front=s;14.在一个链队列Q 中,删除一个结点需要执行的指令是()A、Q.rear=Q.front->next;B、Q.rear->next=Q.rear->next->next;C、Q.front->next=Q.front->next->next;D、Q.front=Q.rear->next;15.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()A、仅修改队头指针B、仅修改队尾指针C、队头尾指针都要修改D、队头尾指针都可能要修改。

C语言栈和队列课后题

C语言栈和队列课后题

• Status DeCyQueue(CyQueue &Q,int &x)// 带tag域的循环队列出队算法 { if(Q.front==Q.rear&&Q.tag==0) return INFEASIBLE; x=Q.base[Q.front]; Q.front=(Q.front+1)%MAXSIZE; if(Q.front==Q.rear) Q.tag=0; //队列空 return OK; }//DeCyQueue
datatype top (twostack *s,int i)
/* 两栈共享向量空间,i是0或1,表示两个栈,本算法是取栈顶元素操作 */
{ datatype x; if (s->top[0]==-1 && s->top[1]==m) return(0);/* 栈空 */ else {switch (i) {case 0: x=s->v[s->top[0]];break; case 1: x=s->v[s->top[1]];break; default: printf(“栈编号输入错误”);return(0); } return(x); /* 取栈顶元素成功 */ } } /* 算法结束 */
• Status EnCyQueue(CyQueue &Q,int x)//带 tag域的循环队列入队算法 { if(Q.front==Q.rear&&Q.tag==1) //tag域的值 为0表示"空",1表示"满" return OVERFLOW; Q.base[Q.rear]=x; Q.rear=(Q.rear+1)%MAXSIZE; if(Q.front==Q.rear) Q.tag=1; //队列满 }//EnCyQueue

c语言数据结构第3章栈和队列自测卷答案

c语言数据结构第3章栈和队列自测卷答案

head 第3章 栈和队列 自测卷答案 姓名 班级一、填空题〔每空1分,共15分〕1. 【李春葆】向量、栈和队列都是 线性 构造,可以在向量的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。

不允许插入和删除运算的一端称为 栈底 。

3. 队列 是被限定为只能在表的一端进展插入运算,在表的另一端进展删除运算的线性表。

4. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。

5. 在具有n 个单元的循环队列中,队满时共有 n-1 个元素。

6. 向栈中压入元素的操作是先 挪动栈顶指针 ,后 存入元素 。

7. 从循环队列中删除一个元素时,其操作是 先 挪动队首指针 ,后 取出元素 。

8. 〖00年统考题〗带表头结点的空循环双向链表的长度等于 0 。

解:二、判断正误〔判断以下概念的正确性,并作出简要的说明。

〕〔每题1分,共10分〕 〔 × 〕1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

错,线性表是逻辑构造概念,可以顺序存储或链式存储,与元素数据类型无关。

〔 × 〕2. 在表构造中最常用的是线性表,栈和队列不太常用。

错,不一定吧?调用子程序或函数常用,CPU 中也用队列。

〔 √ 〕3. 栈是一种对所有插入、删除操作限于在表的一端进展的线性表,是一种后进先出型构造。

〔 √ 〕4. 对于不同的使用者,一个表构造既可以是栈,也可以是队列,也可以是线性表。

正确,都是线性逻辑构造,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

〔 × 〕5. 栈和链表是两种不同的数据构造。

错,栈是逻辑构造的概念,是特殊殊线性表,而链表是存储构造概念,二者不是同类项。

〔 × 〕6. 栈和队列是一种非线性数据构造。

错,他们都是线性逻辑构造,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

栈和队列练习1

栈和队列练习1

第三章栈和队列一、选择题部分1. 一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是(C)。

(A) edcba(B)decba(C)dceab (D)abcde2.栈结构通常采用的两种存储结构是(A)。

(A)线性存储结构和链表存储结构(B)散列方式和索引方式(C)链表存储结构和数组(D)线性存储结构和非线性存储结构3.判定一个顺序栈ST(最多元素为m0)为空的条件是( B)。

(A) ST-〉top!=0 (B)ST-〉top==0(C)ST-〉top!=m0 (D)ST-〉top=m04.判定一个栈ST(最多元素为m0)为栈满的条件是( C)。

(A)ST-〉top!=0 (B)ST-〉top==0(C)ST-〉top==m0(D)ST-〉top==m0-15.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B)。

(A)4,3,2,1(B)1,2,3,4(C)1,4,3,2(D)3,2,4,16.循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear 则当前队列中的元素个数是(B )(A)(rear-front+m)%m (B) rear-front+1 (C)rear-front-1(D)rear-front7.栈和队列的共同点是(C )(A)都是先进后出(B)都是先进先出(C)只允许在端点处插入和删除元素(D)没有共同点8.表达式a*(b+c)-d的后缀表达式是(B)。

(A)abcd*+-(B)abc+*d- (C)abc*+d-(D)-+*abcd9.4个元素a1,a2,a3和a4依次通过一个栈,在a4进栈前,栈的状态,则不可能的出栈序是(C)(A)a4,a3,a2,a1 (B)a3,a2,a4,a1(C)a3,a1,a4,a2 (D)a3,a4,a2,a110.以数组Q[0..m-1]存放循环队列中的元素,变量rear和qulen分别指示循环队列中队尾元素的实际位置和当前队列中元素的个数,队列第一个元素的实际位置是( D )(A)rear-qulen (B)rear-qulen+m(C)m-qulen (D)(1+rear+m-qulen)% m二、填空题部分1.栈的特点是(先进后出),队列的特点是(先进先出)。

《数据结构》习题汇编03第三章栈和队列试题

《数据结构》习题汇编03第三章栈和队列试题

第三章栈和队列试题一、单项选择题1.栈的插入和删除操作在()进行。

A. 栈顶B. 栈底C. 任意位置D. 指定位置2.当利用大小为n的数组顺序存储一个栈时,假定用top==n表示栈空,则向这个栈插入一个元素时,首先应执行()语句修改top指针。

A. top++;B. top--;C. top = 0;D. top;3.若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。

A. 3, 2, 1B. 2, 1, 3C. 3, 1, 2D. 1, 3, 24.在一个顺序存储的循环队列中,队头指针指向队头元素的()位置。

A. 前一个B. 后一个C. 当前D. 后面5.当利用大小为n的数组顺序存储一个队列时,该队列的最大长度为()。

A. n-2B. n-1C. nD. n+16.从一个顺序存储的循环队列中删除一个元素时,需要()。

A. 队头指针加一B. 队头指针减一C. 取出队头指针所指的元素D. 取出队尾指针所指的元素7.假定一个顺序存储的循环队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front+1 == rearB. rear+1 == frontC. front == 0D. front == rear8.假定一个链式队列的队头和队尾指针分别为front和rear,则判断队空的条件为()。

A. front == rearB. front != NULLC. rear != NULLD. front == NULL9.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

若想在链式栈的栈顶插入一个由指针s所指的结点,则应执行操作()。

A. top->link = s;B.s->link = top->link; top->link = s;C. s->link = top; top = s;D. s->link = top; top = top->link;10.设链式栈中结点的结构为(data, link),且top是指向栈顶的指针。

大学《数据结构》第三章:栈和队列-第一节-栈

大学《数据结构》第三章:栈和队列-第一节-栈

第一节栈
一、栈的定义及其运算
1、栈的定义
栈(Stack):是限定在表的一端进行插入和删除运算的线性表,通常将插入、删除的一端称为栈项(top),另一端称为栈底(bottom)。

不含元素的空表称为空栈。

栈的修改是按后进先出的原则进行的,因此,栈又称为后进先出(Last In First Out)的线性表,简称为LIFO表。

真题选解
(例题·填空题)1、如图所示,设输入元素的顺序是(A,B,C,D),通过栈的变换,在输出端可得到各种排列。

若输出序列的第一个元素为D,则输出序列为。

隐藏答案
【答案】DCBA
【解析】根据堆栈"先进后出"的原则,若输出序列的第一个元素为D,则ABCD入栈,输出序列为DCBA
2、栈的基本运算
(1)置空栈InitStack(&S):构造一个空栈S。

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

数据结构(C语言版)例题(第三章:栈和队列)(2008-05-09 12:33:13)转载▼◆3.15③假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的的两个端点。

试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i,x)的算法, 其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么优缺点。

实现下列3个函数:Status InitStack(TwoWayStack &tws, int size);Status Push(TwoWayStack &tws, int i, SElemType x);Status Pop(TwoWayStack &tws, int i, SElemType &x);双向栈类型定义如下:typedef struct {SElemType *elem;int top[2];int size; // 分配给elem的总容量}TwoWayStack; // 双端栈Status InitStack(TwoWayStack &tws, int size){tws.elem=(SElemType*)malloc(sizeof(SElemType)*size);tws.size=size;tws.top[0]=0; //haotws.top[1]=size-1; //以数组下标作为指针;return OK;}Status Push(TwoWayStack &tws, int i, SElemType x){int w=tws.top[0];if(w==tws.top[1]) return ERROR;else if(i==0){tws.elem[tws.top[0]]=x;tws.top[0]=tws.top[0]+1;}else if(i==1){tws.elem[tws.top[1]]=x;tws.top[1]=tws.top[1]-1;}return OK;}Status Pop(TwoWayStack &tws, int i, SElemType &x){ if(tws.top[1]==tws.size-1&&i==1) return ERROR;else if(tws.top[0]==0&&i==0) return ERROR;else if(i==0){tws.top[0]-=1;x=tws.elem[tws.top[0]];}else if(i==1){tws.top[1]+=1;x=tws.elem[tws.top[1]];}return x;}◆3.16②假设如题3.1所述火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。

实现下列函数:void SwitchYard(SqList train, char *s);顺序表类型定义如下:typedef struct {ElemType *elem;int length;int listsize;} SqList; // 顺序表void SwitchYard(SqList train, char *s){ int i,j=0,L;char *p;L=train.length;p=s;for(i=0;i<=L-1;i++){if(train.elem[i]=='H'){*(p++)='U';j++;}else{*p='U'; p++;*p='O'; p++;}}for(;j>0;j--){ *p='O';p++; }}◆3.19④假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…*…,…-…*…+…+…*…+…(…)…)。

编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

实现下列函数:Status MatchCheck(SqList exp);顺序表类型定义如下:typedef struct {ElemType *elem;int length;int listsize;} SqList; // 顺序表Stack是一个已实现的栈。

可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素类型Status InitStack(Stack &s);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);Status GetTop(Stack s, SElemType &e);Status MatchCheck(SqList exp){ Stack s;char *p;SElemType c;InitStack(s);for(p=exp.elem;*p;p++){if(*p=='('||*p=='['||*p=='{') Push(s,*p);else if(*p==')'||*p==']'||*p=='}'){if(StackEmpty(s)) return FALSE;Pop(s,c);if(*p==')'&&c!='(') return FALSE;if(*p==']'&&c!='[') return FALSE;if(*p=='}'&&c!='{') return FALSE;}}if(!StackEmpty(s)) return FALSE;return TRUE;}◆3.20③假设以二维数组g(1..m,1..n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。

编写算法置换点(i0,j0)所在区域的颜色。

约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。

实现下列函数:void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0);表示图像区域的类型定义如下:typedef char GTYPE[m+1][n+1];Stack是一个已实现的栈。

可使用的相关类型和函数:typedef int SElemType; // 栈Stack的元素类型Status StackInit(Stack &s, int initsize);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);Status GetTop(Stack s, SElemType &e);void ChangeColor(GTYPE g, int m, int n,char c, int i0, int j0) { int x,y,old;Stack s;old=g[i0][j0];StackInit(s,m*n*2);Push(s,i0);Push(s,j0);while(!StackEmpty(s)){Pop(s,y);Pop(s,x);if(x>1)if(g[x-1][y]==old){g[x-1][y]=c;Push(s,x-1);Push(s,y);}if(y>1)if(g[x][y-1]==old){g[x][y-1]=c;Push(s,x);Push(s,y-1);}if(xif(g[x+1][y]==old){g[x+1][y]=c;Push(s,x+1);Push(s,y);}if(yif(g[x][y+1]==old){g[x][y+1]=c;Push(s,x);Push(s,y+1);}}}◆3.21③假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

实现下列函数:char *RPexpression_r(char *e);Stack是一个已实现的栈。

可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素类型Status InitStack(Stack &s);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);SElemType Top(Stack s);char *RPexpression_r(char *e){ static char b[20];char *a=b;char w3='k';char w;char w1,w2;Stack S;InitStack(S);while(*e!='\0'){switch(*e){case '+':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/'||w2=='+'||w2=='-') {Pop(S,w);*a=w;a++;}w2=Top(S);if(w2=='+'||w2=='-'){Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S))else Push(S,*e);e++;break;case '-':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/'||w2=='+'||w2=='-') {Pop(S,w);*a=w;a++;}w2=Top(S);if(w2=='+'||w2=='-'){Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '*':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/') {Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '/':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/') {Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '(':Push(S,*e);break;case ')':while(w3!='('&&!StackEmpty(S)){Pop(S,w3);if(w3!='('){*a=w3;a++;}} //whilew3='k';e++;break;default:*a=*e;a++;e++;break;} //switch(*e)} //while(*e!='\0')while(!StackEmpty(S)){Pop(S,w);*a=w;a++;}*a='\0';return b;}◆3.24③试编写如下定义的递归函数的递归算法:g(m,n) = 0 当m=0,n>=0g(m,n) = g(m-1,2n)+n 当m>0,n>=0并根据算法画出求g(5,2)时栈的变化过程。

相关文档
最新文档