您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法习题汇总(4)

2016-04-27 10:36 381 查看
一. 用rear,front表示队尾和队首指针,实现循环队列入队,出队算法

/*入队列*/
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");
}


四.设计算法判断一个算术表达式的括号是否配对

见拙作《栈用于解决括号匹配问题》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: