數據結構與算法習題彙總(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");
}

四.設計算法判斷一個算術表達式的括號是否配對
見拙作《棧用於解決括號匹配問題》

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