数据结构与算法习题汇总(4)
2016-04-27 10:36
381 查看
一. 用rear,front表示队尾和队首指针,实现循环队列入队,出队算法
二.假设以数组存放循环队列的元素,同时设变量rear和num分别作为队尾指针和队列中元素个数记录,试给出判别此循环队列队满的条件,并写出相应的出队入队算法。
三.假设以带头节点的循环链表表示一个队列,并且只设一个队尾指针指向尾元素节点,注意不设队首指针,试写出相应的置空队,入队,出队算法。
四.设计算法判断一个算术表达式的括号是否配对
见拙作《栈用于解决括号匹配问题》
/*入队列*/ status enterqueue(queue *Q,elemtype data){ if((Q->rear+1)%maxsize==Q->front){ printf("队列已满\n"); return ERROR; } Q->data[Q->rear]=data;/*把元素赋值给Q->data数组,同时队尾指针后移*/ Q->rear=(Q->rear+1)%maxsize;/*此处不写Q->rear++的原因是:如果队首指针不在队列开始处,容易造成队首还有若干个空间而却误认为队列已满 ,形成"假溢出”*/ return OK; } /*出队算法*/ status exitqueue(queue *Q,elemtype data){ if(Q->front==Q->rear){ printf("空队列\n"); return ERROR; } data=Q->data[Q->front];/*出队列时从队首指针指向的元素开始*/ printf("%d ",data); Q->front=(Q->front+1)%maxsize;/*队首指针后移,若队首指针在队尾指针之后(存在此种可能,切记!!),则在越过队列末端后 重新回到队列首端*/ }
二.假设以数组存放循环队列的元素,同时设变量rear和num分别作为队尾指针和队列中元素个数记录,试给出判别此循环队列队满的条件,并写出相应的出队入队算法。
#include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int status; typedef int elemtype; typedef struct queue{ elemtype data[MAXSIZE]; int rear; int num; }queue; status visit(elemtype c){ printf("%d ",c); return OK; } status initqueue(queue *Q){ Q->num=0; Q->rear=0; return OK; } status enterqueue(queue *Q,elemtype data){ if(Q->num==MAXSIZE) return ERROR;/*队列满*/ Q->data[Q->rear]=data; Q->rear=(Q->rear+1)%MAXSIZE; Q->num++; return OK; } status exitqueue(queue *Q,elemtype *data){ if(!Q->num) return ERROR;/*空队列*/ *data=Q->data[(Q->rear)-(Q->num)]; Q->num--; return OK; } status traverse(queue *Q){ int i=Q->rear-Q->num; while(i!=Q->rear){ visit(Q->data[i]); i++; } printf("\n"); return OK; } int main(void){ queue Q; int i=0; elemtype data=0; srand(time(NULL)); initqueue(&Q); printf("入列十个数字\n"); for(i=0;i<10;i++){ enterqueue(&Q,rand()%10); } traverse(&Q); for(i=1;i<5;i++){ printf("第%d个数字出队\n",i); exitqueue(&Q,&data); printf("出队数字为%d\n",data); } traverse(&Q); }
三.假设以带头节点的循环链表表示一个队列,并且只设一个队尾指针指向尾元素节点,注意不设队首指针,试写出相应的置空队,入队,出队算法。
#include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int status; typedef int elemtype; typedef struct node{ elemtype data; struct node * next; }node; typedef struct node * linkqueue; status visit(elemtype c){ printf("%d ",c); } int main(void){ linkqueue rear,pmove,head,qmove; int i=0; pmove=rear=(linkqueue)malloc(sizeof(node)); if(!pmove||!rear) return ERROR; head=pmove; /*建立循环链表,并让0~9入队*/ for(i=0;i<10;i++){ qmove=(linkqueue)malloc(sizeof(node)); qmove->data=i; rear->next=qmove; rear=qmove; } rear->next=head; pmove=head->next; printf("将0~9入队后\n"); /*注意循环条件,pmove!=head的意思是pmove从开头出发到尾节点*/ while(pmove!=head){ printf("%d ",pmove->data); pmove=pmove->next; } printf("\n"); /*出队算法*/ pmove=head->next; printf("出队元素为:%d\n",pmove->data); linkqueue smove=pmove->next; free(pmove); pmove=smove; printf("出队后,遍历队列\n"); while(pmove!=head){ printf("%d ",pmove->data); pmove=pmove->next; } printf("\n"); /*置空队算法*/ pmove=head->next; while(pmove!=rear->next){ linkqueue smove=pmove->next; free(pmove); pmove=smove; } printf("\n"); printf("置空队列后,遍历队列\n"); while(pmove!=head){ printf("%d ",pmove->data); pmove=pmove->next; } printf("\n"); }
四.设计算法判断一个算术表达式的括号是否配对
见拙作《栈用于解决括号匹配问题》
相关文章推荐
- 数据结构 - 栈的顺序实现
- 数据结构之链表学习笔记
- 【数据结构】找出N个数据中最大的前k个数据(利用堆排序)
- 数据结构与算法笔记 —— 查找算法及代码实现
- 数据结构之链表的增删操作的Java实现
- 数据结构之排序算法实现(选自大话数据结构)
- 数据结构-堆排序
- 数据结构-堆的应用-海量数据
- 【数据结构】优先级队列的实现(适配器模式)
- 数据结构实验报告 栈和队列
- 数据结构之二叉树的先序、中序、后续的求法
- 数据结构-并查集
- JS数据结构与算法--字典
- 数据结构-树的基本操作
- 【ZOJ3939 The 13th Zhejiang Provincial Collegiate Programming ContestD】【日期前缀和预处理】The Lucky Week 第n个幸运
- 数据结构之链表
- Boyer-Moore 算法 与KMP算法的对比
- Java数据结构与算法之插入排序
- 数据结构顺序表
- 【数据结构与算法】排序算法