用栈和队列判断回文

用栈和队列判断回文
用栈和队列判断回文

用栈和队列判断回文

栈和队列实验二

一、实验目的

1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。

2、掌握栈和队列的特点,即后进先出和先进先出的原则。

3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队

等运算在顺序存储结构和链式存储结构上的实现。二、实验内容

1(请简述栈的基本特性和栈的几种基本操作的机制

栈是限定仅在表位进行插入或删除操作的线性表,栈的修改是按照后进先出的原则进行的,根据这种特性进行回文判断。

[问题描述]

对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。[基本要求]

(1)数据从键盘读入;

(2)输出要判断的字符串;

(3)利用栈的基本操作对给定的字符串判断其是否是回文,

若是则输出“该字符串是回文”,否则输出“该字符串不是

回文”。

[测试数据]

由学生任意指定。

2(设计简单的程序实现用栈判断回文

#include

#include

#include

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct{

char *base;

char *top;

int stacksize;

1

}SqStack;

void InitStack(SqStack &S){

S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char));

if(!S.base)exit(0);

S.top = S.base;

S.stacksize = STACK_INIT_SIZE;}

void Push(SqStack &S,char e){

if(S.top - S.base >= S.stacksize){

S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof(char));

if(!S.base) printf("存储分配失败~");

S.top = S.base + S.stacksize;

S.stacksize += STACKINCREMENT;

}

*S.top++ = e;

}

char Pop(SqStack &S,char &e){

if(S.top == S.base) {

printf("该栈为空!");

printf("\n");

e = 'E';

}else{

e = *--S.top;

}

return e;

}

void main(){

2

SqStack S;

InitStack(S);

char a[30];

char c;

char e;

int k = 0;

printf("请输入要转换的字符串,以#号结束:\n"); for(int i = 0;i < 30;i++){

scanf("%c",&c);

if(c != '#'){

a[i] = c;

}else{

k = i;

break;

}

}

for(int h = 0 ; h < k;h++){

Push(S,a[h]);

}

int g = 0; //定义一个计数器

for(int w = 0;w < k;w++){

char x = Pop(S,e);

printf("%c",x);

if(a[w] == x){//比较数组中的第w个值与栈中返回的第w个值是否相等g++; //若相等的话,计数器加一

}

}

printf("\n");

if(g == k){ //判断计数器的值与输入的数值是否相等

printf("YES");//相等的话打印出YES

}else{

printf("NO");//否则打印出NO

}

printf("\n");

}运行结果如下图:

3

1(输入字符为回文字符

2(输入字符不是回文字符

三、编程并上机调试运行

四、时间、地点

五、指导教师

,在书写过程中若出现错误~望老师指出~谢谢, 4

数据结构C语言队列-回文

实验课题一:回文(palindrome)是指一个字符串从前面读和从后面读都一样,仅使用若干栈和队列、栈和队列的ADT函数以及若干个int类型和char类型的变量,设计一个算法来判断一个字符串是否为回文。假设字符串从标准输入设备一次读入一个字符,算法的输出结果为true或者false。 可以用一些字符串测试输出结果,如: "abcdeabcde","madamimadam" 等 #include #include #define m 100 typedef struct { char stack[m]; int top; }stackstru; typedef struct { char queue[m]; int front; int rear; }queuestru; void main() { int stinit(stackstru *s); //初始化顺序栈 int stempty(stackstru *s); //判断栈是否为空 int stpush(stackstru *s,char x); //入栈 char stpop(stackstru *s); //出栈 int quinit(queuestru *q); //初始化循环队列 int quempty(queuestru *q); //判断队列是否为空 int enqueue(queuestru *q,char e); //入队 char dequeue(queuestru *q); //出队 char c; int flag=0; stackstru *s=(stackstru *)malloc(sizeof(stackstru)); queuestru *q=(queuestru *)malloc(sizeof(queuestru)); stinit(s); quinit(q); printf("Input a string:\n");

栈和队列实现回文

栈和队列的应用 1.题目要求: 输入一段字符串,判断字符串是否是回文。回文字符串的定义:字符串的顺序输入和逆序输出内容完全一样。要求出入一段字符串,以‘#’为结束符;判断是否是回文,并输出; 2.实验目的: 通过做回文的题,来熟悉栈和队列的结构以及内容,最终达到掌握 3.实验步骤 1.定义栈的结构体: typedef struct { //栈结构的定义 int *top; int *base; int stacksize; }sqstack; 2.定义队列的结构体: typedef struct queue{ //队列的结构体定义 int data; struct queue *next; }queue,*que; typedef struct { que front; //队列的头指针 que rear; //队列的尾指针 }Q; 4.相关函数: void inistack(sqstack &s)//初始化一个空栈 bool just(sqstack &s)//判断栈是否为空,返回bool类型 void push(sqstack &s,int e)//入栈 char pop(sqstack &s,int &e)//出栈,返回char类型 void initQ(Q &q)//初始化一个空队列 pushq(Q &q,int e)//入队 char popq(Q &q,int &e)//出队,返回char类型 5.总体结构图

6.运行结果分析 完成对字符串的判断以及输出; 7.程序清单

#include #include typedef struct { //栈结构的定义 int *top; int *base; int stacksize; }sqstack; void inistack(sqstack &s)//初始化一个空栈 { s.base=(int *)malloc(100*sizeof(sqstack)); if(!s.base) { cout<<"分配失败"<=s.stacksize) { s.base=(int *)realloc(s.base,(s.stacksize+10)*sizeof(sqstack)); s.top=s.base+s.stacksize; s.stacksize+=10; } *s.top++=e; } char pop(sqstack &s,int &e)//出栈 { if(s.base==s.top) { cout<<"栈已经为空"<

栈和队列判断回文

(C语言版数据结构)利用栈和队列判断回文 (2010-11-03 11:51:45) 标签: it // File Name: palindrome.h // // Destination:利用栈和队列判断字符串是否是回文 // #ifndef PALINDROME #define PALINDROME #include // 链式队列结构的定义 typedef char ElemType; typedef struct Node { char data; // 元素数据 struct Node *next;// 链式队列中结点元素的指针 }QNode,*QueuePtr; typedef struct { QueuePtr front;// 队列头指针 QueuePtr rear;// 队列尾指针 }LinkQueue; // 栈结构的定义 typedef struct Stack { ElemType *base; ElemType *top; int stacksize; }SqStack;

// 链式队列的基本操作 bool InitQueue(LinkQueue *Q); bool EnQueue(LinkQueue *Q, ElemType e); bool DeQueue(LinkQueue *Q, ElemType *e); // 栈的基本操作 bool InitStack(SqStack *S); bool Push(SqStack *S, ElemType e); bool Pop(SqStack *S, ElemType *e); #endif // File Name: palindrome.cpp // // Destination:利用栈和队列判断字符串是否是回文 #include #include #include "palindrome.h" const int STACK_INIT_SIZE = 100; // 初始分配的长度 const int STACKINCREMENT = 10; // 分配内存的增量 //操作目的:初始化队列 //初始条件:无 //操作结果:构造一个空的队列 //函数参数: //LinkQueue *Q 待初始化的队列 //返回值: // bool 操作是否成功 ------------------------------------------------------------*/ bool InitQueue(LinkQueue *Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof (QNode)); if (!Q->front) { exit(0); } Q->front->next = NULL; return true; } //操作目的:在队列末尾插入元素e //初始条件:队列Q已存在 //操作结果:插入元素e作为队列新的尾结点 //函数参数:

栈与队列习题参考答案

习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。 一、选择题 1.在栈中存取数据的原则是( B )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。 A.1234 B. 1324 C. 4321 D. 1423 3.在链栈中,进行出栈操作时(B )。 A.需要判断栈是否满 B. 需要判断栈是否为空 C. 需要判断栈元素的类型 D. 无需对栈作任何差别 4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 5.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。则顺序栈的判满的条件是( C )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 6.在队列中存取数据元素的原则是( A )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首 和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。 A.rear-front B. rear-front+1 C. (rear-front+maxSize)%maxSize D. (rear-front+1)%maxSize 10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度 为( B )。 A.O(1) B.O(n) C.O(log2n) D.O(n2) 二、填空题 1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进行。允许插入和删除 操作的一端称为栈顶,而另一端称为栈底。栈具有后进先出的特点。 2.栈也有两种存储结构,一种是顺序存储,另一种是链式存储;以这两种存储结构存储的栈分别称为顺序 栈和链栈。 3.在顺序栈中,假设栈顶指针top是指向栈顶元素的下一个存储单元,则顺序栈判空的条件是 top==0 ; 栈顶

回文判断实验二

回文判断实验二

洛阳理工学院实验报告 系别计算机系班级B13053 学号B13053235 姓名李登辉 2 课程名称数据结构实验日期2014.3.28 实验名称栈和队列的基本操作成绩 实验目的: 熟悉掌握栈和队列的特点,掌握与应用栈和队列的基本操作算法,训练和提高结构化程序设计能力及程序调试能力。 实验条件: 计算机一台,Visual C++6.0

实验内容: 1.问题描述 利用栈和队列判断字符串是否为回文。称正读与反读都相同的字符序列为“回文”序列。要求利用栈和队列的基本算法实现判断一个字符串是否为回文。栈和队列的存储结构不限。 2.数据结构类型定义 typedef struct { char elem[MAX]; int top; }SeqStack; 顺序栈 3.模块划分 void InitStack(SeqStack *S):栈初始化模块, int Push(SeqStack *S,char x,int cnt):入栈操作 int Pop(SeqStack * S,char * x):出栈操作 void InitQuene(SeqQuene *Q):队列初始化 int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作 int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作 void main():主函数 4.详细设计 #include #include #define MAX 50 #define FALSE 0 #define TURE 1//定义栈 typedef struct { char elem[MAX]; int top; }SeqStack; //定义循环队列 typedef struct { char element[MAX]; int front; int rear; }SeqQuene; //初始化栈

数据结构实验二(栈和队列)

实验二栈和队列的基本操作及其应用 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序 存储结构和链式存储结构上的实现。 二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,学生 可以根据自己的情况任选一个! 题目一:回文判断(*) [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如 “abba”是回文,而“abab”不是回文。 [基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出 “Yes”,否则输出“No”。 [测试数据] 由学生任意指定。 题目二:顺序栈和循环队列基本操作(*) [基本要求] 1、实现栈的基本操作 六项基本操作的机制是:初始化栈:init_stack(S);判断栈空:stack_empty(S);取栈顶元素:stack_top(S,x);入栈:push_stack(S,x);出栈:pop_stack(S);判断栈满:stack_full(S) 2、实现队列的基本操作 六项基本操作的机制是:初始化队列:init_queue(Q);判断队列是否为空:queue_empty(Q);取队头元素:queue_front(Q,x);入队:enqueue(Q,x);出队:outqueue(Q,x);判断队列是否为满:queue_full(Q) [测试数据]

由学生任意指定。 题目三:商品货架管理(**) [问题描述] 商店货架以栈的方式摆放商品。生产日期越近的越靠近栈底,出货时从栈顶取货。一天营业结束,如果货架不满,则需上货。入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,使生产日期越近的越靠近栈底。 [基本要求] 设计一个算法,保证每一次上货后始终保持生产日期越近的商品越靠近栈底。 [实现提示] 可以用一个队列和一个临时栈作为周转。 [测试数据] 由学生任意指定。 三、实验前的准备工作 1、掌握栈的逻辑结构和存储结构。 2、熟练掌握栈的出栈、入栈等操作。 3、掌握队列的逻辑结构和存储结构。 4、熟练掌握队列的出队、入队等操作 四、实验报告要求 1、实验报告要按照实验报告格式规范书写。 *2、写出算法设计思路。 3、实验上要写出多批测试数据的运行结果。 4、结合运行结果,对程序进行分析。 题目四:Rails(ACM训练题) Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreover, it turned out that the

用栈和队列判断回文

实验二栈和队列 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队 等运算在顺序存储结构和链式存储结构上的实现。 二、实验内容 1.请简述栈的基本特性和栈的几种基本操作的机制 栈是限定仅在表位进行插入或删除操作的线性表,栈的修改是按照后进先出的原则进行的,根据这种特性进行回文判断。 [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。 [基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“该字符串是回文”,否则输出“该字符串不是回文”。 [测试数据] 由学生任意指定。 2.设计简单的程序实现用栈判断回文 #include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef struct{ char *base; char *top; int stacksize; }SqStack; void InitStack(SqStack &S){ S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char)); if(!S.base)exit(0); S.top = S.base; S.stacksize = STACK_INIT_SIZE; } void Push(SqStack &S,char e){ if(S.top - S.base >= S.stacksize){ S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof(char)); if(!S.base) printf("存储分配失败!"); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; } char Pop(SqStack &S,char &e){ if(S.top == S.base) { printf("该栈为空!"); printf("\n"); e = 'E'; }else{ e = *--S.top;

回文序列判断(运用栈以及队列完成)

回文序列判断实验报告 系别:通信工程 班级: 0905班 学号: 18 号

1.实验目的:熟悉栈的各项操作 2.实验内容: 利用栈的操作完成读入的一个以@结尾的字符序列是否是回文序列的判断. 回文序列即正读与反读都一样的字符序列; 例如:123&321@是; 123&4321@、123&312@不是 算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为@停止输入,因为要满足特定的要求:序列1&序列2,故设置夜歌标记量falg=1,判断输入的元素个数是否为奇数个,若为偶数个则令flag=0,若为奇数个继续判断栈的中间元素是否为&,若不是则令flag=0,若是,将栈和队列中的元素依次出列,判断是否相等,若不相等则令flag=0,最后将flag的值返回给主函数,若flag被修改为0说明不是回文序列,否则反之!! 判断回文序列的流程图: 3.实验感想与体会 通过本次的上机,对栈的各项基本操作都有了更好的掌握,同时明白了一些小的细节问题可能会影响到整个程序的正确的运行,本次的实验我通过了运用栈和队列,可以说对队列的一些基本的操作也得以了巩固和提高!更加体会到,自己写程序上机操作的重要性,它要比课本上学的要多得多! 4.附录(源代码及运行图) #include

#define MAX 100 typedef struct//栈结构体 { char e[MAX]; int top; }SeqStack; typedef struct NODE//队列结构体 { char d; struct NODE *next; }LinkQN; typedef struct//封装头指针为指针 { LinkQN *front; LinkQN *rear; }LinkQ; InitS(SeqStack *s)//初始化顺序栈 { s->top=-1; } int push(SeqStack *s,char ch)//入栈 { if(s->top==MAX-1) return(0); s->top++; s->e[s->top]=ch; return(1); } int pop(SeqStack *s,char *x)//出栈 { if(s->top==-1) return(0); *x=s->e[s->top]; s->top--; return(1); } void InitQ(LinkQ *q)//链队列初始化 { q->front=(LinkQN *)malloc(sizeof(LinkQN)); if(!q->front) { printf("分配空间失败!");

第3章++栈和队列+课后习题答案

第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大于等于0 if(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的容量至少应该是()。 A.2 B.3 C.4 D.6(9)在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为()。 A.top不变B.top=0 C.top-- D.top++(10)设计一个判别表达式中左,右括号是否配对出现的算法,采用()数据结构最佳。 A.线性表的顺序存储结构 B.队列 C. 线性表的链式存储结构 D. 栈

第三章+栈和队列(参考答案)

第三章栈和队列 一、判断题 1、链栈的初始化是指开辟足够多的结点,然后置栈顶指针为 NULL。(×) 2、递归定义的数据结构通常不需要用递归的算法来实现对它的操作。(×) 二、填空题 1、向一个链式栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给___栈顶指针_____。 2、迷宫问题是一个回溯控制的问题,最好使用____栈______的方法来解决。 3、有如下递归过程: Void Print(int w) { int i; if (w!=0) { Print(w?1); for (i=1;i<=w;i++) printf(“%3d”,w); printf(“\n”); } } 调用语句print(4)的结果是__________。 1 2 2 3 3 3 4 4 4 4 4、假设用循环单链表实现队列,若队列非空,且队尾指针为R, 则将新结点S加入队列时,需执行下面语句:_ S->next=R->next _________;___ R->next=S _______;R=S; 三、选择题 1、设有4个数据元素a1、a 2、a3和a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按a1、a2、a 3、a4次序每次进入一个元素。假设栈或队的初始状态都是空。 现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A 2,第二次出栈得到的元素是 B 4;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C 1,第二次出队得到的元素是 D 2。经操作后,最后在栈中或队中的元素还有 E 2个。 供选择的答案: A~D:①a1 ②a2 ③ a3 ④a4 E:①1 ②2 ③ 3 ④ 0 2、栈是一种线性表,它的特点是 A 2。设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。往栈中推入(PUSH)一个新元素时,变量T的值 B 2;从栈中弹出(POP)一个元素时,变量T的值 C 1。设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素的序列是 D 6,变量T的值是 E 4。 供选择的答案: A:①先进先出②后进先出③进优于出④出优于进⑤随机进出 B,C:①加1 ②减1 ③不变④清⑤加2 ⑥减2 D:① a,b ②b,c ③c,a ④b,a ⑤ c,b ⑥a,c E:① n+1 ②n+2 ③ n ④ n-1 ⑤ n-2 3、在做进栈运算时,应先判别栈是否 A 2;在做退栈运算时,应先判别栈是否 B 1。当栈中元素为n个,做进栈运算时发生上溢,则说明该栈的最大容量为 C 2。

栈和队列自测题

第3章栈和队列自测卷 一、填空题 1. 向量(线性表)、栈和队列都是结构,可以在向量的位置插入和删除元素;对于栈只能 在插入和删除元素;对于队列只能在插入和删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。不允许插入和删除运算的一端称 为。 3. 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 4. 在一个循环队列中,队首指针指向队首元素的位置。 5. 在具有n个单元的循环队列中,队满时共有个元素。 6. 向栈中压入元素的操作是先,后。 7. 从循环队列中删除一个元素时,其操作是先,后。 8. 带表头结点的空循环双向链表的长度等于。 二、判断正误(判断下列概念的正确性,并作出简要的说明。)(每小题1分,共10分)()1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 ()2. 在表结构中最常用的是线性表,栈和队列不太常用。 ()3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 ()4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 ()5. 栈和链表是两种不同的数据结构。 ()6. 栈和队列是一种非线性数据结构。 ()7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。 ()8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。 ()9. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 ()10. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。 三、单项选择题(每小题1分,共20分) ()1. 栈中元素的进出原则是 A.先进先出B.后进先出C.栈空则进D.栈满则出

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

第3章栈和队列 一、选择题 1.栈结构通常采用的两种存储结构是(A )。 A、顺序存储结构和链表存储结构 B、散列和索引方式 C、链表存储结构和数组 D、线性链表结构和非线性存储结构 2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B ) A、ST.top-ST.base<>0 B、ST.top-ST.base==0 C、ST.top-ST.base<>n D、ST.top-ST.base==n 3.向一个栈顶指针为HS 的链栈中插入一个s 结点时,则执行( C ) 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 保存被删除结点的值,则执行( C) 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 的后缀表达式为( B ) A、abcdd+- B、abc+*d- C、abc*+d- D、-+*abcd 6.中缀表达式A-(B+C/D)*E 的后缀形式是( D ) A、AB-C+D/E* B、ABC+D/E* C、ABCD/E*+- D、ABCD/+E*- 7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B ) A、4,3,2,1 B、1,2,3,4 C、1,4,3,2 D、3,2,4,1 8.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队 列为空的条件是() A、Q.rear-Q.front==n B、Q.rear-Q.front-1==n C、Q.front==Q.rear D、Q.front==Q.rear+1 9.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队 列为满的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从队列中删除一个元素, 再加入两个元素后,rear 和front 的值分别为() A、1,5 B、2, 4 C、4,2 D、5,1 11.用单链表表示的链式队列的队头在链表的()位置 A、链头 B、链尾 C、链中 12.判定一个链队列Q(最多元素为n 个)为空的条件是() A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==(Q.rear+1)%n D、Q.front!=(Q.rear+1)%n 13.在链队列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;

第4章栈与队列自测卷答案

head 栈和队列 一、填空题(每空1分,共15分) 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 必定是最后入栈的(事实上题目已经表明了),那

栈和队列基本操作实验报告

栈和队列基本操作实验报告 实验二堆栈和队列基本操作的编程实现【实验目的】 堆栈和队列基本操作的编程实现 要求: 堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数:2H) 【实验内容】 内容: 把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。可以实验一的结果自己实现数据输入、数据显示的函数。 利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。【实验分析、说明过程】 分析: 进栈操作 先创建一个以x为值的新结点p,其data域值为x则进栈操作步骤如下: 将新结点p的指针域指向原栈顶S(执行语句p->next=S)。 将栈顶S指向新结点p(执行语句S=p)。 注:进栈操作的?与?语句执行顺序不能颠倒,否则原S指针其后的链表将丢失。

出栈操作 先将结点栈顶S数据域中的值赋给指针变量*x,则删除操作步骤如下: 结点p 指针域指向原栈顶S(执行语句p=S)。 栈顶S指向其的下一个结点(执行语句S=S->next) 释放p结点空间(执行语句free(p))。 队列分析:用链式存储结构实现的队列称为链队列,一个链队列需要一个队头指针和一个队尾指针才能唯一确定。队列中元素的结构和前面单链表中的结点的结构一样。为了操作方便,在队头元素前附加一个头结点,队头指针就指向头结点。 【思考问题】 1. 栈的顺序存储和链表存储的差异, 答:栈的顺序存储有‘后进先出’的特点,最后进栈的元素必须最先出来,进出栈是有序的,在对编某些需要按顺序操作的程序有很大的作用。

实验报告(栈和队列)

附录A 实验报告 课程:数据结构(c语言)实验名称:栈和队列 系别:数字媒体技术实验日期: 11月15号 专业班级:组别: 姓名:学号: 实验报告内容 验证性实验 一、预习准备: 实验目的: 1. 掌握栈的顺序表示、链表表示以及相应操作的实现。特别注意栈空和栈满 的条件; 2. 掌握队列的顺序表示、链表表示以及相应操作的实现。特别是循环队列中 队头与队尾指针的变化情况; 实验环境:Widows操作系统、VC6.0 实验原理: 1.定义: 栈:只允许在一端插入和删除的线性表,允许插入和删除的一端称为 栈顶(top),另一端称为栈底(bottom)。 队列: 是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队 头(front),允许插入的一端叫做队尾(rear)。 2.特点: 栈:后进先出(LIFO) 队列:先进先出(FIFO, First In First Out) 9

3. 表示: 栈:(1)栈的数组表示—顺序栈 (2)栈的链接表示—链式栈 队列:(1)队列的顺序存储结构表示——循环队列 (2)队列的链式表示—链队列 实验内容和要求: 分别使用顺序循环队列和堆栈以及链式队列和堆栈编写程序:判断一个字符序列是否是回文。回文是指一个字符序列以中间字符为基准,两边字符完全相同。如:“ABCDEDCBA”。字符串长度小于等于80,用于判断回文的字符串不包括字符串的结束标记符。 基本要求: (1)字符序列可由用户从键盘随意输入; (2)可以连续测试多个字符序列,由用户决定退出测试程序; 算法思想: 判断回文的算法思想是:把字符串中的字符逐个分别存入队列和堆栈中,然后逐个出队列和退栈并比较出队列的数据元素和退栈的数据元素是否相等,若全部相等则该字符序列为回文,否则就不是回文。 基本操作: 回文判断操作主要包括入栈和入队列、退栈和出队列操作。在对堆栈以及队列进行操作之前,必须对队列以及堆栈进行初始化。若使用链式堆栈和链式队列,操作结束后必须销毁链表。 二、实验过程: 程序流程图:

用栈和队列判断回文

用栈和队列判断回文 栈和队列实验二 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队 等运算在顺序存储结构和链式存储结构上的实现。二、实验内容 1(请简述栈的基本特性和栈的几种基本操作的机制 栈是限定仅在表位进行插入或删除操作的线性表,栈的修改是按照后进先出的原则进行的,根据这种特性进行回文判断。 [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。[基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文, 若是则输出“该字符串是回文”,否则输出“该字符串不是 回文”。 [测试数据] 由学生任意指定。 2(设计简单的程序实现用栈判断回文 #include #include

#include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct{ char *base; char *top; int stacksize; 1 }SqStack; void InitStack(SqStack &S){ S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char)); if(!S.base)exit(0); S.top = S.base; S.stacksize = STACK_INIT_SIZE;} void Push(SqStack &S,char e){ if(S.top - S.base >= S.stacksize){ S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof(char)); if(!S.base) printf("存储分配失败~"); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; }

实验总结报告-栈和队列

实验总结报告—栈和队列 学号:姓名:时间: 一、目的 1.做实验的目的 加深对线性结构栈和队列的理解,学会定义栈和队列的存储结构,加强对栈和队列操作机制的理解,掌握栈和队列的基本操作,了解栈和队列的一些应用。 2.撰写实验报告的目的 对本次实验情况进行总结,加强对实验内容的理解,对实验过程有一个系统的认识,从中获得本次试验的经验,并对实验结果进行适当的分析,加深对栈和队列的理解和认识。 二、内容 1.说明实验次数及实验内容 本次实验用一次实验课时完成 实验内容: (1)、编写函数CreatStack_sq(), DestoryStack_sq(), Push_sq(), Pop_sq(),StackEmpty_sq() 和 StackTraverse_sq(),分别完成创建空栈,销毁栈,入栈,出栈,判断栈是否为空,遍历栈底到栈顶依 次打印栈内元素等功能(不要修改原栈),完成后进行测试。 测试要求:在main 中,建立栈;判断栈是否为空;将0~9 入栈;将栈

顶两个元素出栈, 两元素求和后再入栈;从栈底到栈顶依次打印元素,再从栈顶到栈底打印元素;销毁栈。 void CreatStack_sq(SqStack &S, int msize = STACK_INIT_SIZE) { ... } void DestoryStack_sq(SqStack &S) { ... }void Push_sq(SqStack &S, ElementType e) { ... } bool Pop_sq(SqStack &S, ElementType &e) { ... } bool StackEmpty_sq(SqStack S) { ... }

相关文档
最新文档