一. 用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");
}
四.設計算法判斷一個算術表達式的括號是否配對
見拙作《棧用於解決括號匹配問題》