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

一. 用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");
}

四.设计算法判断一个算术表达式的括号是否配对
见拙作《栈用于解决括号匹配问题》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章