栈和队列的基本操作讲解

栈和队列的基本操作讲解
栈和队列的基本操作讲解

《数据结构与算法》实验报告

专业班级姓名学号

实验项目

实验二栈和队列的基本操作。

实验目的

1、掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。

2、掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。

实验内容

题目1:

进制转换。利用栈的基本操作实现将任意一个十进制整数转化为R进制整数

算法提示:

1、定义栈的顺序存取结构

2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)

3、定义一个函数用来实现上面问题:

十进制整数X和R作为形参

初始化栈

只要X不为0重复做下列动作

将X%R入栈X=X/R

只要栈不为空重复做下列动作

栈顶出栈输出栈顶元素

题目2:

利用队列的方式实现杨辉三角的输出。

算法设计分析

(一)数据结构的定义

1、栈的应用

实现十进制到其他进制的转换,该计算过程是从低位到高位顺序产生R进制数的各个位数,而打印输出一般从高位到低位进行,恰好与计算过程相反。因此,运用栈先进后出的性质,即可完成进制转换。

栈抽象数据结构描述

typedef struct SqStack /*定义顺序栈*/

{

int *base; /*栈底指针*/

int *top; /*栈顶指针*/

int stacksize; /*当前已分配存储空间*/

} SqStack;

2、队列的应用

由于是要打印一个数列,并且由于队列先进先出的性质,肯定要利用已经进队的元素在其出队之前完成杨辉三角的递归性。即,利用要出队的元素来不断地构造新的进队的元素,即在第N行出队的同时,来构造杨辉三角的第N+1行,从而实现打印杨辉三角的目的。

队列抽象数据结构描述

typedef struct SeqQueue

{

int data[MAXSIZE];

int front; /*队头指针*/

int rear; /*队尾指针*/

}SeqQueue;

(二)总体设计

1、栈

(1)主函数:统筹调用各个函数以实现相应功能

int main()

(2)空栈建立函数:对栈进行初始化。

int StackInit(SqStack *s)

(3)判断栈空函数:对栈进行判断,若栈中有元素则返回1,若栈为空,则返回0。

int stackempty(SqStack *s)

(4)入栈函数:将元素逐个输入栈中。

int Push(SqStack *s,int x)

(5)出栈函数:若栈不空,则删除栈顶元素,并用x返回其值。

int Pop(SqStack *s,int x)

(6)进制转换函数:将十进制数转换为R进制数

int conversion(SqStack *s)

2、队列

(1)主函数:统筹调用各个函数以实现相应功能

void main()

(2)空队列建立函数:对队列进行初始化。

SeqQueue *InitQueue()

(3)返回队头函数:判断队是否为空,若不为空则返回队头元素。

int QueueEmpty(SeqQueue *q)

(4)入队函数:将元素逐个输入队列中。

void EnQueue(SeqQueue *q,int x)

(5)出队函数:若队列不空,则删除队列元素,并用x返回其值。

int DeQueue(SeqQueue *q)

(6)计算队长函数:计算队列的长度。

int QueueEmpty(SeqQueue *q)

(7)输出杨辉三角函数:按一定格式输出杨辉三角。

void YangHui(int n)

(三)各函数的详细设计:

1、栈

(1)int main()主函数

定义s为栈类型

调用函数建立空栈

调用进制转换函数

返回0值

(2)int StackInit(SqStack *s)空栈建立函数

动态分配内存

判断分配成功并返回相应的值

若成功,初始化存储空间

(3)int stackempty(SqStack *s)判断栈空函数

若栈为空,返回0,否则返回1

(4)int Push(SqStack *s,int x)入栈函数

比较栈中元素所占空间与已分配存储空间

若栈满,追加存储空间

若存储失败则返回0

存储空间不够,添加增量

逐个输入数据元素

返回x的值

(5)int Pop(SqStack *s,int x)出栈函数

如果栈为空,则返回0

若栈不空,则删除栈顶元素,用x返回其值

(6):int conversion(SqStack *s)进制转换函数

输入要转化的十进制数

输入要转化为几进制

运用求余运算改变进制数

运用选择结构控制十六进制的输出方式

2、队列

(1)void main()主函数

输入杨辉三角的行数

调用杨辉三角输出函数

输出杨辉三角

(2)SeqQueue *InitQueue()空队列建立函数

动态分配内存

建立队列并返还该队列

(3)int QueueEmpty(SeqQueue *q)返回队头函数

判断队列为空,返回0

若不空返回队头元素

(4)void EnQueue(SeqQueue *q,int x)入队函数

判断队满

若不满,逐个添加元素

(5)int DeQueue(SeqQueue *q)出队函数

若头指针等于尾指针,顺序队列是空的不能做删除操作

否则,删除队列

用x返回出队的值

(6)int QueueEmpty(SeqQueue *q)计算队长函数

头指针减尾指针,求队列长度

(7)void YangHui(int n)输出杨辉三角函数

定义变量

循环输出元素1

插入1为队列队尾元素

使用空格控制输出格式

逐个输出队列元素,并构建下一行需输出的队列

运算结果插入队尾

实验测试结果及结果分析

(一)测试结果

(进制转换)

(杨辉三角)

(二)结果分析

调试程序时,出现了许多错误。如:有时候写的没有出现问题,但运行的结果是Press anu key to continue 。程序肯定有错,但为什么会出现这种问题呢。分号的忘记那还是很经常的,要加强注意。在做表达式的计算的时候一定要注意何时入栈何时出栈,队列也是同样的。如果如栈与出栈的情况判断不清楚就无法得出答案。在写主函数时,如果是用void main的形式,那么可以不用有返回值,如果是int main的话,要有返回值,既末尾要有return语句。实验总结

1.进一步巩固了C语言的基础,尤其是指针那部分;

2.通过实验加深了对栈和队列的操作方面知识的认识。更深层次了解了栈和队列的操作特点及不同之处;

3.通过实验达到了理论与实践结合的目的,提高了自己的编程能力;

4.程序可能不够完善需要在学习过程中不断去完善,这需要平时的努力。

附录实验程序代码

一、进制转换

#include

#include

#include

#define STACK_INIT_SIZE 100 /*存储空间初始分配量*/

#define STACKINCEREMENT 10 /*存储空间分配增量*/

typedef struct SqStack /*定义顺序栈*/

{ int *base; /*栈底指针*/

int *top; /*栈顶指针*/

int stacksize; /*当前已分配存储空间*/

} SqStack;

/*建立空栈函数*/

int StackInit(SqStack *s) /*构造一个空栈*/

{ s->base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));/*动态分配内存*/

if(!s->base) /*存储分配失败*/

return 0;

s->top=s->base;

s->stacksize=STACK_INIT_SIZE; /*初始化存储空间*/

return 1;

}

/*判断栈空函数*/

int stackempty(SqStack *s) /*判断栈是否为空*/

{ if(s->top==s->base)

{ return 1; }

else

{ return 0; }

}

/*入栈函数 */

int Push(SqStack *s,int x) /*入栈,插入x为新的栈顶元素*/

{ if(s->top-s->base>=s->stacksize) /*比较栈中元素所占空间与已分配存储空间*/

{

s->base=(int *)realloc(s->base,(s->stacksize+STACKINCEREMENT)*sizeof(int));

/*栈满,追加存储空间*/

if(!s->base) /*若存储失败则返回0*/

return 0;

s->top=s->base+s->stacksize;

s->stacksize+=STACKINCEREMENT; /*存储空间不够,添加增量*/

}

*(s->top++)=x;/*逐个输入数据元素*/

return x;

}

/*出栈函数*/

int Pop(SqStack *s,int x)/*出栈操作*/

{ if(s->top==s->base) /*如果栈为空,则返回0*/

return 0;

x=*--s->top;/*若栈不空,则删除栈顶元素,用x返回其值*/

return x;

}

/*进制转换函数*/

int conversion(SqStack *s)

{ /*将所输入的任意一个非负的十进制数转换为R进制的数*/

int n,x=0,R=0;

printf("输入要转化的十进制数:\n");

scanf("%d",&n);

printf("要转化为几进制:\n输入2代表二进制\n输入8代表八进制\n输入16代表十六进制\n");

scanf("%d",&R);

printf("将十进制数%d 转化为%d 进制是:\n",n,R);

while(n)

{ Push(s,n%R);/*运用求余运算改变进制数*/

n=n/R;

}

while(!stackempty(s))

{ x=Pop(s,x);

switch(x) /*十六进制的输出方式*/

{ case 10: printf("A");

break;

case 11: printf("B");

break;

case 12: printf("C");

break;

case 13: printf("D");

break;

case 14: printf("E");

break;

case 15: printf("F");

break;

default: printf("%d",x);

}

}

printf("\n");

return 0;

}

/*主函数*/

int main()

{ SqStack s; /*定义s为栈类型*/

StackInit(&s);

conversion(&s);

return 0;

}

二、输出杨辉三角

#include

#include

#include

#define MAXSIZE 10

typedef struct SeqQueue/*定义队列*/

{

int data[MAXSIZE];

int front; /*队头指针*/

int rear; /*队尾指针*/

}SeqQueue;

/*建立空队列函数*/

SeqQueue *InitQueue() /*构造一个空队列*/

{

SeqQueue *q;

q=(SeqQueue*)malloc(sizeof(SeqQueue));/*动态分配内存*/

q->front=q->rear=0;

return q;

}

/*入队函数*/

void EnQueue(SeqQueue *q,int x)/*插入元素x为队列的新的队尾元素*/ {

if((q->rear+1)%MAXSIZE==q->front) /*判断队满*/

printf("\n顺序循环队列是满的!");

else

{

q->data[q->rear]=x;

q->rear=(q->rear+1)%MAXSIZE;

}

}

/*出队函数*/

int DeQueue(SeqQueue *q)/*若队列不空则删除队头元素,并返回其值*/ {

int x;

if(q->front==q->rear)

{

printf("\n顺序队列是空的!不能做删除操作!");

return 0;

}

x=q->data[q->front]; /*用x返回出队的值*/

q->front=(q->front+1)%MAXSIZE;

return x;

}

/*求队列长度函数*/

int QueueEmpty(SeqQueue *q) /*求队列的长度*/

{

return(q->front-q->rear);

}

/*返回队头函数*/

int GetHead(SeqQueue *q)/*用e返回队头元素*/

{

int e;

if(q->front==q->rear) /*队列为空*/

e=0;

else

e=q->data[q->front];

return e;

}

/*输出杨辉三角函数*/

void YangHui(int n)/*输出杨辉三角*/

{

SeqQueue *q;

int i,j,a,b;

for(i=1;i

printf(" ");

printf("1\n"); /*循环输出元素1*/

q=InitQueue();

EnQueue(q,0);

EnQueue(q,1); /*插入1为队列队尾元素*/

for(j=1;j

{

for(i=1;i

printf(" ");

EnQueue(q,0);

while(t!=0); /*逐个输出队列元素,并构建下一行需输出的队列*/ {

a=DeQueue(q);

b=GetHead(q);

if(t) printf("%5d"b);

else printf("\n");

EnQueue(q,a+b);

}

}

DeQueue(q);

printf("%5d",DeQueue(q));

while(!QueueEmpty(q))

{

b=DeQueue(q);

printf("%5d",b);

}

}

/*主函数*/

void main()

{

int n;

printf("请输入杨辉三角的行数:\n");

scanf("%d",&n);

YangHui(n);

getchar();

printf("\n");

栈和队列的基本操作

《数据结构与算法》实验报告 专业班级学号 实验项目 实验二栈和队列的基本操作。 实验目的 1、掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。 2、掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。 实验容 题目1: 进制转换。利用栈的基本操作实现将任意一个十进制整数转化为R进制整数 算法提示: 1、定义栈的顺序存取结构 2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3、定义一个函数用来实现上面问题: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将X%R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈输出栈顶元素 题目2: 利用队列的方式实现辉三角的输出。 算法设计分析 (一)数据结构的定义 1、栈的应用 实现十进制到其他进制的转换,该计算过程是从低位到高位顺序产生R进制数的各个位数,而打印输出一般从高位到低位进行,恰好与计算过程相反。因此,运用栈先进后出的性质,即可完成进制转换。 栈抽象数据结构描述 typedef struct SqStack /*定义顺序栈*/ { int *base; /*栈底指针*/ int *top; /*栈顶指针*/ int stacksize; /*当前已分配存储空间*/ } SqStack;

2、队列的应用 由于是要打印一个数列,并且由于队列先进先出的性质,肯定要利用已经进队的元素在其出队之前完成辉三角的递归性。即,利用要出队的元素来不断地构造新的进队的元素,即在第N行出队的同时,来构造辉三角的第N+1行,从而实现打印辉三角的目的。 队列抽象数据结构描述 typedef struct SeqQueue { int data[MAXSIZE]; int front; /*队头指针*/ int rear; /*队尾指针*/ }SeqQueue; (二)总体设计 1、栈 (1)主函数:统筹调用各个函数以实现相应功能 int main() (2)空栈建立函数:对栈进行初始化。 int StackInit(SqStack *s) (3)判断栈空函数:对栈进行判断,若栈中有元素则返回1,若栈为空,则返回0。 int stackempty(SqStack *s) (4)入栈函数:将元素逐个输入栈中。 int Push(SqStack *s,int x) (5)出栈函数:若栈不空,则删除栈顶元素,并用x返回其值。 int Pop(SqStack *s,int x) (6)进制转换函数:将十进制数转换为R进制数 int conversion(SqStack *s) 2、队列 (1)主函数:统筹调用各个函数以实现相应功能 void main() (2)空队列建立函数:对队列进行初始化。 SeqQueue *InitQueue() (3)返回队头函数:判断队是否为空,若不为空则返回队头元素。 int QueueEmpty(SeqQueue *q) (4)入队函数:将元素逐个输入队列中。 void EnQueue(SeqQueue *q,int x) (5)出队函数:若队列不空,则删除队列元素,并用x返回其值。 int DeQueue(SeqQueue *q) (6)计算队长函数:计算队列的长度。 int QueueEmpty(SeqQueue *q) (7)输出辉三角函数:按一定格式输出辉三角。 void YangHui(int n)

数据结构(C语言)队列的基本操作

实验名称:实验四队列的基本操作 实验目的 掌握队列这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序队列或链式队列,并完成下列操作: (1)初始化队列; (2)队列是否为空; (3)出队; (4)入队。 算法设计分析 (一)数据结构的定义 单链表存储结构定义为: struct Node; //链表单链表 typedef struct Node *PNode; int dui; dui =1; struct Node { int info; PNode link; }; struct LinkQueue { PNode f; PNode r; }; typedef struct LinkQueue *PLinkQueue; (二)总体设计 程序由主函数、创建队列函数、判断是否为空队列函数、入队函数、出队函数、取数函数、显示队列函数、菜单函数组成。其功能描述如下: (1)主函数:调用各个函数以实现相应功能 main() { PLinkQueue a; //定义链表a int b,c,e; //b 菜单选择c选择继续输入e输入元素 do { //菜单选择 mune(); scanf("%d",&b);

switch(b) { case 1://初始化 a=create(); //初始化队列 case 2: //入队 do { printf("\n请输入需要入队的数:"); if(e!=NULL) { scanf("%d",&e); enQueue(a,e); } printf("是否继续入队?(是:1 否:0)\n"); scanf("%d",&c); } while(c==1); break; case 3: //出队 c=frontQueue(a); deQueue(a); if(dui!=0) { printf("\n出队为:%d\n",c); } dui=1; break; case 4: //显示队中元素 showQueue(a); break; case 5: return; default: printf("输入错误,程序结束!\n"); return; } } while(a!=5); { return 0; } } (三)各函数的详细设计: Function1: PLinkQueue create(void)//创队

栈和队列习题答案

第三章栈和队列习题答案 一、基础知识题 设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题: (1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈) (2)能否得到出栈序列1423和1432并说明为什么不能得到或者如何得到。 (3)请分析1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。 答:(1)出栈序列为:1324 (2)不能得到1423序列。因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push (3),Push(4),Pop()。这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。能得到1432的出栈序列。具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。 (3)在1,2 ,3 ,4 的24种排列中,可通过相应入出栈操作得到的序列是: 1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321 不能得到的序列是: 1423,2413,3124,3142,3412,4123,4132,4213,4231,4312 链栈中为何不设置头结点 答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。 循环队列的优点是什么如何判别它的空和满 答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。三是设置一计数器记录队列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。 设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何若只设尾指针呢答:当只设头指针时,出队的时间为1,而入队的时间需要n,因为每次入队均需从头指针开始查找,找到最后一个元素时方可进行入队操作。若只设尾指针,则出入队时间均为1。因为是循环链表,尾指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。 指出下述程序段的功能是什么 (1) void Demo1(SeqStack *S){ int i; arr[64] ; n=0 ; while ( StackEmpty(S)) arr[n++]=Pop(S); for (i=0, i< n; i++) Push(S, arr[i]); } .. // 设Q1已有内容,Q2已初始化过 while ( ! QueueEmpty( &Q1) ) { x=DeQueue( &Q1 ) ; EnQueue(&Q2, x); n++;} for (i=0; i< n; i++) { x=DeQueue(&Q2) ; EnQueue( &Q1, x) ; EnQueue( &Q2, x);} 答: (1)程序段的功能是将一栈中的元素按反序重新排列,也就是原来在栈顶的元素放到栈底,栈底的

实验三 栈和队列的应用

实验三栈和队列的应用 1、实验目的 (1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基本操作。 (2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法; (3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法; (4)掌握栈和队列的应用; 2、实验内容 1)栈和队列基本操作实现 (1)栈的基本操作:采用顺序存储或链式存储结构(数据类型自定义),实现初始化栈、判栈是否为空、入栈、出栈、读取栈顶元素等基本操作,栈的存储结构自定义。 (2)队列的基本操作:实现循环队列或链队列的初始化、入队列、出队列、求队列中元素个数、判队列空等操作,队列的存储结构自定义。 2)栈和队列的应用 (1)利用栈的基本操作将一个十进制的正整数转换成二进制数据,并将其转换结果输出。 提示:利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法为: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将x%R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 (2) 利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Right”,否则输出“Wrong”。

(3) 假设循环队列中只设rear(队尾)和quelen(元素个数据)来分别表示队尾元素的位置和队中元素的个数,写出相应的入队和出队程序。 (4)选作题:编写程序实现对一个输入表达式的括号配对。 3、实验步骤 (1)理解栈的基本工作原理; (2)仔细分析实验内容,给出其算法和流程图; (3)用C语言实现该算法; (4)给出测试数据,并分析其结果; (5)在实验报告册上写出实验过程。 4、实验帮助 算法为: 1) 定义栈的顺序存取结构 2) 分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3) 定义一个函数用来实现上面问题: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将X % R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 5、算法描述 (1))初始化栈S (创建一个空栈S) void initstack(sqstack *S) { S->base=(ElemType *) malloc(INITSIZE*sizeof(ElemType)); if(!S->base) exit (-1); S->top=0; /*空栈标志*/ S->stacksize = INITSIZE; } (2) 获取栈顶元素 int gettop(sqstack S,ElemType *e) //顺序钱 { if ( S.top==0 ) /* 栈空 */

PTA第三章栈与队列练习题

1-1 通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出得序列为:123。(2分) T F 作者: DS课程组 单位: 浙江大学 1-2 在用数组表示得循环队列中,front值一定小于等于rear值。(1分) T F 作者: DS课程组 单位: 浙江大学 1-3 若一个栈得输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样得出栈序列。(2分) T F 作者: 徐镜春 单位: 浙江大学 1-4 If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}、(2分) T F 作者: 徐镜春 单位: 浙江大学 1-5 所谓“循环队列”就是指用单向循环链表或者循环数组表示得队列。(1分) T F 作者: DS课程组 单位: 浙江大学 1-6 An algorithm to check for balancing symbols in an expression uses a stack to store the symbols、(1分) T F 2-1 设栈S与队列Q得初始状态均为空,元素a、b、c、d、e、f、g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队得顺序就是b、d、c、f、e、 a、g,则栈S得容量至少就是: (2分) 1. 1 2. 2 3. 3 4. 4 作者: DS课程组

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈和队列及其应用_ 一.实验目的及要求 (1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们; (2)本实验训练的要点是“栈”的观点及其典型用法; (3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); (2)应用栈的基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中的语法检查(括号的匹配)。 (5)利用栈实现表达式的求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等); A.顺序储存: 代码部分: 栈" << endl; cout << " 2.出栈" << endl; cout << " 3.判栈空" << endl; cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl; cout << " 0.退出系统" << endl;

cout << "你的选择是:" ; } 链式储存: 代码部分: 栈"<>select; switch (select){ case 0:break; case 1: cout<<"push data:"; cin>>e; if(push(L,e)){

数据结构第3章栈和队列自测卷答案(供参考)

head 1. 向量、栈和队列都是 线性 结构,可以在向量的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。不允许插入和删除运算的一端称为 栈底 。 3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 4. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。 5. 在具有n 个单元的循环队列中,队满时共有 n-1 个元素。 6. 向栈中压入元素的操作是先 移动栈顶指针 ,后 存入元素 。 7. 从循环队列中删除一个元素时,其操作是 先 移动队首指针 ,后 取出元素 。 8.带表头结点的空循环双向链表的长度等于 0 。 解: 二、判断正误(判断下列概念的正确性,并作出简要的说明。) (每小题1分,共10分) ( × )1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。 ( × )2. 在表结构中最常用的是线性表,栈和队列不太常用。 错,不一定吧?调用子程序或函数常用,CPU 中也用队列。 ( √ )3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 ( √ )4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 ( × )5. 栈和链表是两种不同的数据结构。 错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。 ( × )6. 栈和队列是一种非线性数据结构。 错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 ( √ )7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。 ( √ )8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底 分别设在这片内存空间的两端。 ( × )9. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 错,后半句不对。 ( × )10. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。 错,有可能。 三、单项选择题(每小题1分,共20分) ( B )1.栈中元素的进出原则是 A.先进先出 B.后进先出 C.栈空则进 D.栈满则出 ( C )2.若已知一个栈的入栈序列是1,2,3,…,n ,其输出序列为p1,p2,p3,…,pn ,若p1=n ,则pi 为 A.i B.n=i C.n-i+1 D.不确定 解释:当p1=n ,即n 是最先出栈的,根据栈的原理,n 必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n ,则出栈的序列是n ,…,3,2,1。 (若不要求顺序出栈,则输出序列不确定) ( B )3.判定一个栈ST (最多元素为m0)为空的条件是

栈和队列的基本操作的实现

封面: 安徽大学 网络工程 栈和队列的基本操作的实现 ______2010\4\12

【实验目的】 1.理解并掌握栈和队列的逻辑结构和存储结构; 2.理解栈和队列的相关基本运算; 3.编程对相关算法进行验证。 【实验内容】 (一)分别在顺序和链式存储结构上实现栈的以下操作(含初始化,入栈,出栈,取栈顶元素等): 1.构造一个栈S,将构造好的栈输出; 2.在第1步所构造的栈S中将元素e 入栈,并将更新后的栈S输出; 3.在第2步更新后所得到的栈S中将栈顶元素出栈,用变量e返回该元素,并将更新后的栈S输出。(二)分别在链队列和循环队列上实现以下操作(初始化,入队,出队,取队头元素等): 1.构造一个队列Q,将构造好的队列输出; 2.在第1步所构造的队列Q中将元素e入队,并将更新后的队列Q输出; 3.在第2步更新后所得到的队列Q中将队头元素出队,用变量e返回该元素,并将更新后的队列Q输出。

【要求】 1.栈和队列中的元素要从终端输入; 2.具体的输入和输出格式不限; 3.算法要具有较好的健壮性,对运行过程中的错误 操作要做适当处理。 三、实验步骤 1.本实验用到的数据结构 (1)逻辑结构:线性结构 (2)存储结构:程序一、四(顺序存储结构); 程序二、三(链式存储结构); 2.各程序的功能和算法设计思想 程序一:顺序栈 # include # include # include #define STACKINITISIZE 100 # define STACKINCREMENT 10 # define OK 1 # define ERROR 0 # define OVERFLOW -2 typedef int SElemtype; typedef int status; typedef struct { SElemtype *base; SElemtype *top; int stacksize; }sqstack; void Initstack (sqstack *s) { (*s).base = (SElemtype *)malloc(STACKINITISIZE * sizeof (SElemtype)); if(!(*s).base) exit(OVERFLOW);

栈和队列(必备)

栈和队列是操作受限的线性表,好像每本讲数据结构的数都是这么说的。有些书按照这个思路给出了定义和实现;但是很遗憾,这本书没有这样做,所以,原书中的做法是重复建设,这或许可以用不是一个人写的这样的理由来开脱。 顺序表示的栈和队列,必须预先分配空间,并且空间大小受限,使用起来限制比较多。而且,由于限定存取位置,顺序表示的随机存取的优点就没有了,所以,链式结构应该是首选。 栈的定义和实现 #ifndef Stack_H #define Stack_H #include "List.h" template class Stack : List//栈类定义 { public: void Push(Type value) { Insert(value); } Type Pop() { Type p = *GetNext(); RemoveAfter(); return p; }

Type GetTop() { return *GetNext(); } List ::MakeEmpty; List ::IsEmpty; }; #endif 队列的定义和实现 #ifndef Queue_H #define Queue_H #include "List.h" template class Queue : List//队列定义{ public: void EnQueue(const Type &value) { LastInsert(value); } Type DeQueue() {

Type p = *GetNext(); RemoveAfter(); IsEmpty(); return p; } Type GetFront() { return *GetNext(); } List ::MakeEmpty; List ::IsEmpty; }; #endif 测试程序 #ifndef StackTest_H #define StackTest_H #include "Stack.h" void StackTest_int() { cout << endl << "整型栈测试" << endl;

实验二 栈和队列

实验二栈和队列 一、实验目的 1、掌握栈的结构特性及其入栈,出栈操作; 2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。 二、实验预习 说明以下概念 1、顺序栈: 2、链栈: 3、循环队列: 4、链队 三、实验内容和要求 1、阅读下面程序,将函数Push和函数Pop补充完整。要求输入元素序列1 2 3 4 5 e,运行结果如下所示。 #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef int ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/

}SqStack; int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType e); /*入栈*/ int Pop(SqStack *S,ElemType *e); /*出栈*/ int CreateStack(SqStack *S); /*创建栈*/ void PrintStack(SqStack *S); /*出栈并输出栈中元素*/ int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ }/*Push*/ int Pop(SqStack *S,ElemType *e){ }/*Pop*/ } /*CreateStack*/ int CreateStack(SqStack *S){ int e; if(InitStack(S)) printf("Init Success!\n"); else { printf("Init Fail!\n"); return ERROR; } printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e)) Push(S,e);

实验二 堆栈和队列基本操作的编程实现

实验二堆栈和队列基本操作的编程实现 【实验目的】 堆栈和队列基本操作的编程实现 要求: 堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数:2H) 【实验内容】 内容: 把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。可以实验一的结果自己实现数据输入、数据显示的函数。 利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。 【思考问题】 1.栈的顺序存储和链表存储的差异? 2.还会有数据移动吗?为什么? 3.栈的主要特点是什么?队列呢? 4.栈的主要功能是什么?队列呢? 5.为什么会有环状队列? 【参考代码】 (一)利用顺序栈实现十进制整数转换转换成r进制 1、算法思想 将十进制数N转换为r进制的数,其转换方法利用辗转相除法,以N=3456,r=8为例转换方法如下: N N / 8 (整除)N % 8(求余) 3456 432 0 低 432 54 0 54 6 6 6 0 6 高 所以:(3456)10 =(6600)8 我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。 算法思想如下:当N>0时重复1,2 ①若N≠0,则将N % r 压入栈s中,执行2;若N=0,将栈s的内容依次出栈,算法结束。 ②用N / r 代替N 2、转换子程序

第三章栈和队列练习题

第三章栈和队列练习题 一、单项选择题 1.一个顺序栈一旦被声明,其占用空间的大小()。 A.已固定B.可以改变C.不能固定D.动态变化 2.链栈和顺序栈相比,有一个比较明显的缺点,即()。 A.插入操作更加方便B.通常不会出现栈满的情况 C.不会出现栈空的情况D.删除操作更加方便 3.用单链表表示的链式队列的队头在链表的()位置。 A.链头B.链尾C.链中D.任意位置 4.在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入缓冲区中,而打印机则从缓冲区中取出数据打印,该缓冲区应该是一个()结构。 A.堆栈B.队列C.数组D.先性表 5.若已知一个栈的入栈序列是1,2,3,…,30,其输出序列是p1,p2,p3,…p n,若p1=30,则p10为()。 A.11 B.20 C.19 D.21 6.循环队列A[m] 存放其元素,用front和rear分别表示队头及队尾,则循环队列满的条件是()。 A.(rear+1)%m=front B.rear =front+1 C.rear=front D.(rear+1)%m-1=front 7.在一个栈顶指针为top的链栈中,将一个p指针所指的结点入栈,应执行()。 A.top->next=p; B.p->next=top->next; top->next=p; C.p->next=top; top=p; D.p->next=top->next; top=top->next; 8.在一个栈顶指针为top的链栈中删除一个结点时,用x保存被删结点的值,则执行()。 A.x=top;top=top->next; B.x=top->data;

队列的基本操作代码

队列的基本操作代码: #include #include #define MAXQSIZE 100 #define OVERFLOW 0 #define ERROR 0 #define OK 1 typedef int QElemType; typedef int Status; typedef struct { QElemType *base; int front; int rear; int tag; }SqQueue; Status InitQueue(SqQueue &Q) { Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base) exit(OVERFLOW);//存储分配失败 Q.front=Q.rear=0; tag=0; return OK; } int QueueLength(SqQueue Q) { return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;//返回Q的元素个数,即队列的长度} Status EnQueue(SqQueue &Q,QElemType e) { if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;//队列满 Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK; } Status DeQueue(SqQueue &Q,QElemType &e) { if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front];

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

数据结构练习第三章栈和队列 一、选择题 1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.向顺序栈中压入新元素时,应当()。 A.先移动栈顶指针,再存入元素 B.先存入元素,再移动栈顶指针C.先后次序无关紧要 D.同时进行 3.允许对队列进行的操作有( )。 A. 对队列中的元素排序 B. 取出最近进队的元素 C. 在队头元素之前插入元素 D. 删除队头元素 4.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 5.设用链表作为栈的存储结构则退栈操作()。 A. 必须判别栈是否为满 B. 必须判别栈是否为空 C. 判别栈元素的类型 D.对栈不作任何判别 6.设指针变量front表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,指针变量s指向将要入队列的结点X,则入队列的操作序列为()。 A.front->next=s;front=s; B. s->next=rear;rear=s; C. rear->next=s;rear=s; D. s->next=front;front=s; 7.设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为()。 A.top=top+1; B. top=top-1; C. top->next=top; D. top=top->next; 8.队列是一种()的线性表。 A. 先进先出 B. 先进后出 C. 只能插入 D. 只能删除 9.设输入序列1、2、3、…、n经过栈作用后,输出序列中的第一个元素是n,则输出序列中的第i个输出元素是()。 A. n-i B. n-1-i C. n+l -i D.不能确定 10.设输入序列为1、2、3、4、5、6,则通过栈的作用后可以得到的输出序列为()。 A. 5,3,4,6,1,2 B. 3,2,5,6,4,1 C. 3,1,2,5,4,6 D. 1,5,4,6,2,3 11.队列的删除操作是在()进行。 A.队首 B.队尾 C.队前 D.队后 12.当利用大小为N 的数组顺序存储一个栈时,假定用top = = N表示栈空,则退栈时,用()语句修改top指针。 A.top++; B.top=0; C.top--; D.top=N; 13.队列的插入操作是在()进行。

数据结构实验三栈和队列的应用

第三章栈和队列的应用 【实验目的】 1.熟练掌握栈和队列的结构,以及这两种数据结构的特点; 2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法; 3.熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法; 第一节知识准备 一、栈: 1. 基本概念 栈是一种限定仅在表的一端进行插入与删除操作的线性表。允许进行插入与删除操作的这一端称为栈顶,而另一端称为栈底,不含元素的空表称为空栈,插入与删除分别称进栈与出栈。 由于插入与删除只能在同一端进行,所以较先进入栈的元素,在进行出栈操作时,要比较后才能出栈。特别是,最先进栈者,最后才能出栈,而最晚进栈者,必最先出栈。因此,栈也称作后进先出 (Last In First Out)的线性表,简称LIFO表。 栈示意图见图3-1 2. 栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ | ∈ElemSet, i=1,2,...,n, n>=0} 数据关系:R1={< , >| , ∈D, i=2,...,n} 基本操作: InitStack(&S) 构造一个空栈S StackEmpty(S) 判断栈S是否为空 StackLength(S) 返回栈S的元素个数,即栈的长度 GetTop(S,&e) 取栈S的栈顶元素 Push(&S,e) 将元素e入栈 Pop(&S,&e) 删除S的栈顶元素并用e返回其值(即出栈) }ADT Stack

3. 栈的表示: 栈有两种存储表示方法:顺序存储结构和链式存储结构。 (1)顺序存储结构: #define STACK_INIT_SIZE 100; //存储空间初始分配量 #define STACKINCREMENT 10; //存储空间分配增量 typedef struct{ SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int StackSize; //栈的当前容量 }SqStack; (2)链式存储结构: Typedef struct Lnode{ ElemType data; struct Lnode *next; }Lnode, *LinkList; 二、队列: 1. 与栈相对应,队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端进行删除元素。允许插入的一端称队尾,允许删除的一端称队头。插入与删除分别称为入队与出队。队列示意图见图3-2:────────────── 出队←a1 a2 …… an-1 ←an进队 ────────────── 队头队尾 图3-2 队列 2. 队列的抽象数据类型定义: ADT Queue{ 数据对象:D={ | ∈ElemSet, i=1,2,...,n, n>=0} 数据关系:R1={< , >| , ∈D, i=2,...,n} 基本操作: InitQueue(&Q) 构造一个空队列Q

栈和队列的基本操作讲解

《数据结构与算法》实验报告 专业班级姓名学号 实验项目 实验二栈和队列的基本操作。 实验目的 1、掌握栈的基本操作:初始化栈、判栈为空、出栈、入栈等运算。 2、掌握队列的基本操作:初始化队列、判队列为空、出队列、入队列等运算。 实验内容 题目1: 进制转换。利用栈的基本操作实现将任意一个十进制整数转化为R进制整数 算法提示: 1、定义栈的顺序存取结构 2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) 3、定义一个函数用来实现上面问题: 十进制整数X和R作为形参 初始化栈 只要X不为0重复做下列动作 将X%R入栈X=X/R 只要栈不为空重复做下列动作 栈顶出栈输出栈顶元素 题目2: 利用队列的方式实现杨辉三角的输出。 算法设计分析 (一)数据结构的定义 1、栈的应用 实现十进制到其他进制的转换,该计算过程是从低位到高位顺序产生R进制数的各个位数,而打印输出一般从高位到低位进行,恰好与计算过程相反。因此,运用栈先进后出的性质,即可完成进制转换。 栈抽象数据结构描述 typedef struct SqStack /*定义顺序栈*/ { int *base; /*栈底指针*/ int *top; /*栈顶指针*/ int stacksize; /*当前已分配存储空间*/ } SqStack; 2、队列的应用 由于是要打印一个数列,并且由于队列先进先出的性质,肯定要利用已经进队的元素在其出队之前完成杨辉三角的递归性。即,利用要出队的元素来不断地构造新的进队的元素,即在第N行出队的同时,来构造杨辉三角的第N+1行,从而实现打印杨辉三角的目的。

队列抽象数据结构描述 typedef struct SeqQueue { int data[MAXSIZE]; int front; /*队头指针*/ int rear; /*队尾指针*/ }SeqQueue; (二)总体设计 1、栈 (1)主函数:统筹调用各个函数以实现相应功能 int main() (2)空栈建立函数:对栈进行初始化。 int StackInit(SqStack *s) (3)判断栈空函数:对栈进行判断,若栈中有元素则返回1,若栈为空,则返回0。 int stackempty(SqStack *s) (4)入栈函数:将元素逐个输入栈中。 int Push(SqStack *s,int x) (5)出栈函数:若栈不空,则删除栈顶元素,并用x返回其值。 int Pop(SqStack *s,int x) (6)进制转换函数:将十进制数转换为R进制数 int conversion(SqStack *s) 2、队列 (1)主函数:统筹调用各个函数以实现相应功能 void main() (2)空队列建立函数:对队列进行初始化。 SeqQueue *InitQueue() (3)返回队头函数:判断队是否为空,若不为空则返回队头元素。 int QueueEmpty(SeqQueue *q) (4)入队函数:将元素逐个输入队列中。 void EnQueue(SeqQueue *q,int x) (5)出队函数:若队列不空,则删除队列元素,并用x返回其值。 int DeQueue(SeqQueue *q) (6)计算队长函数:计算队列的长度。 int QueueEmpty(SeqQueue *q) (7)输出杨辉三角函数:按一定格式输出杨辉三角。 void YangHui(int n) (三)各函数的详细设计: 1、栈 (1)int main()主函数 定义s为栈类型 调用函数建立空栈

试验 --循环队列的基本操作及应用

数据结构实验报告 ----试验三循环队列的基本操作及应用 一、问题描述: 熟悉并掌握循环队列的相关操作,自己设计程序,实现循环队列的构造、清空、销毁及队列元素的插入和删除等相关操作。 二、数据结构设计: #define MAXQSIZE 10 //最大队列长度 struct SqQueue { QElemType *base; //初始化动态分配存储空间 Int front; // 头指针,若队列不空,只想对列头元素 int rear; //尾指针,若队列不空,指向队列尾元素的 //下一个位置 }; 三、功能设计: 程序中所涉及到的函数如下: Status InitQueue(SqQueue &Q) //构造一个空队列Q Status DestroyQueue(SqQueue &Q) //销毁队列Q,Q不再存在 Status ClearQueue(SqQueue &Q) //将Q清为空队列 Status QueueEmpty(SqQueue Q) //若队列Q为空队列,则 //返回TRUE,否则返回FALSE int QueueLength(SqQueue Q) //返回Q的元素个数,即队列长度Status GetHead(SqQueue Q,QElemType &e)//若队列不空,则用e返回Q的对 //头元素,并返回OK,否则返回ERROR Status EnQueue(SqQueue &Q,QElemType e)//插入元素e为Q的新的队尾元素Status DeQueue(SqQueue &Q,QElemType &e)//若队列不空,则删除Q的队头 //元素,用e返回其值,并返回 //OK,否则返回ERROR Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))//从队头到队尾依次 //对队列Q中每个元素调用函数 //vi()。一旦vi失败,则操作失败四、源程序: // c1.h (程序名) #include #include #include // malloc()等 #include // INT_MAX等 #include // EOF(=^Z或F6),NULL

相关文档
最新文档