logo资料库

数据结构实验报告2-栈与队列-队列基本操作算法-实验内容及要求.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
数据结构实验报告 学号:xxxxxxxxxxx 知识范畴:线性表 姓名:xxxxxx 专业:计算机科学与技术 完成日期:2019 年 03 月 25 日 实验题目:队列基本操作算法 实验内容及要求: 评分 满分——5 分 编写程序,建立容量为 n(建议 n=8)的循环队列,完成以下程序功能。输入字符#,执行一 次出队操作,屏幕上显示出队字符;输入字符@,队列中所有字符依次出队并按出队次序在屏 幕上显示各字符;输入其它字符,则输入的字符入队。 要求采用队头/队尾间隔至少一个空闲元素的方法来实现循环队列;空队执行出队操作及 队满执行入队操作需显示提示信息。 注意:反复输入字符时,需正确处理好回车键(即输入缓冲区的’\n’字符)的读取问题。 实验目的:掌握循环队列的基本操作算法。 数据结构设计简要描述: 采用一个结构体结点;结构体结点包含整形类型的队列队头指针,队尾指针,最大容量和 一个字符型数组。 算法设计简要描述: 算法实现元素出队操作、入队操作和全部出队操作,出队和入队由队头和队尾指针记录。 输入/输出设计简要描述: 从键盘输入‘@’时队列元素全部出队,输入‘#’时队头元素出队,输入其他字符时该字 符入队,输入“回车”时结束队列操作。 编程语言说明: 使用 Code::Blocks 编程。主要代码采用 C 语言实现 ;动态存储分配采用 C 语言的 malloc 实现;输入与输出采用 C 语言的 scanf 和 printf 函数实现;程序注释采用 C 规范。 主要函数说明: void initQueue(SqQueue* q,int n); // 初始化一个队列 int full(SqQueue *q); int empty(SqQueue *q); // 判断队列是否为满 // 判断队列是否为空 int popQueue(SqQueue *q, char *ch);// 元素出队操作 int pushQueue(SqQueue *q, char *ch);// 元素入队操作 程序测试简要报告: please input queue capacity:8 please choose operating(@ is pop all queue element, # is pop one queue element, others is push queue,until \n):a push queue success! please choose operating(@ is pop all queue element, # is pop one queue element, others is push queue,until \n):b push queue success! 1 / 4
please choose operating(@ is pop all queue element, # is pop one queue element, others is push queue,until \n):c push queue success! please choose operating(@ is pop all queue element, # is pop one queue element, others is push queue,until \n):# pop queue element :a please choose operating(@ is pop all queue element, # is pop one queue element, others is push queue,until \n):@ all queue element :b c 源程序代码: // Predefine.h #include #include #include typedef struct{ char *elem; int n;// 队列容量 int f;// 队头指针 int r;//队尾指针 }SqQueue; // main.c #include #include #include "Predefine.h" extern void initQueue(SqQueue* q,int n); extern int full(SqQueue *q); extern int empty(SqQueue *q); extern int popQueue(SqQueue *q, char *ch); 2 / 4
extern int pushQueue(SqQueue *q, char *ch); int main() { int n; char c1,c; SqQueue q; printf("please input queue capacity:"); scanf("%d",&n); // 输入队列最大容量 getchar(); initQueue(&q,n); while(n) { printf("please choose operating(@ is pop all queue element," " # is pop one queue element, others is push queue,until \\n):"); scanf("%c",&c1); getchar(); switch(c1) { case '#':if(popQueue(&q,&c)) // 输入‘#’的时候出队一次 {printf("pop queue element :");printf("%c\n",c);} else {printf("pop queue failed!\n");} break; case '@':if(!empty(&q))printf("all queue element :"); // 输入‘@’的时候全部元素出队 else {printf("pop queue failed!\n"); break;} while(popQueue(&q,&c)){printf("%c\t",c);} printf("\n"); break; case '\n':n=0;printf("exit operation !\n");break; // 输入回车操作结束 default: if(pushQueue(&q,&c1)) // 输入其他字符将该字符入队 {printf("push queue success!\n");} else {printf("push queue failed!\n");} break; } if(c1!='@' && c1!='#' && full(&q)==1) // 如果队列已满且不是出队操作的时候提示选择出队 printf("the queue is full!\n"); printf("you can choose pop one queue or pop all queue element!\n"); { } } return 0; } // Initalaze.c #include "Predefine.h" // 初始化队列 void initQueue(SqQueue *queue, int n){ queue->n = n; queue->r = queue->f = -1; // 队头。队尾同时指向同一个数据单元 queue->elem = (char *)malloc(sizeof(char)*n); } 3 / 4
// CheckEmpty.c #include "Predefine.h" // 判断队列是否为空,为空返回 1 int empty(SqQueue *q) { return q->f==q->r; // 如果队满,返回 1,否则返回 0 } // CheckFull.c #include "Predefine.h" // 判断队列是否为空,为空返回 1 int empty(SqQueue *q) { return q->f==q->r; // 如果队满,返回 1,否则返回 0 } // PopQueue.c // 元素出队,出队成功返回 1,否则返回 0 #include "Predefine.h" extern int empty(SqQueue *q); int popQueue(SqQueue *q, char *ch) { if(empty(q)) return 0;// ¶Ó¿Õ£¬³ö¶Óʧ°Ü q->f = (q->f+1)%q->n; *ch = q->elem[q->f]; return 1; } // PushQueue.c #include "Predefine.h" extern int full(SqQueue *q); // 元素入队,入队成功返回 1,失败返回 0 int pushQueue(SqQueue *q, char *ch) { if(full(q)) return 0; // 队满,入队失败 q->r = (q->r+1)%q->n; q->elem[q->r] = *ch; return 1;// 入队成功,返回 1 } 4 / 4
分享到:
收藏