1. 程式人生 > >資料結構(二)之順序佇列與鏈佇列

資料結構(二)之順序佇列與鏈佇列

  • 順序佇列

運用陣列結構來構建的線性佇列就是順序佇列。
本例實現了順序佇列的入隊、出隊、判斷隊空、初始化佇列、列印佇列等操作。

#include<iostream>
using namespace std;
const int m=1000;
struct queue{
	int data[m];
	int front;
	int rear;
};
void enqueue(queue &Q,int x);
int delqueue(queue &Q);
bool queueempty(queue Q);
void initqueue(queue &Q);
void printqueue(queue Q);
int main(){
	queue Q;
	/*以下是測試程式碼
	initqueue(Q);
	cout<<queueempty(Q)<<endl;
	enqueue(Q,1);
	enqueue(Q,2);
	printqueue(Q);
	cout<<delqueue(Q)<<endl;
	printqueue(Q);
	*/
	return 0;
}
void enqueue(queue &Q,int x){
	if((Q.rear+1)%m==Q.front) printf("隊滿\n");
	else{
		Q.data[Q.rear]=x;
		Q.rear=(Q.rear+1)%m;
	}
}
int delqueue(queue &Q){
	int x=Q.data[Q.front];
	Q.front=(Q.front+1)%m;
	return x;
}
bool queueempty(queue Q){
	if(Q.front==Q.rear) return true;
	else return false;
}
void initqueue(queue &Q){
	Q.front=0;
	Q.rear=Q.front;
}
void printqueue(queue Q){
	for(int i=Q.front;i!=Q.rear;i++){
		if(i>=m) i=i-m;
		printf("%d",Q.data[i]);
	}
	printf("\n");
}
  • 鏈佇列

運用鏈式結構來構建的線性佇列就是鏈佇列。
本例實現了鏈佇列的建立、出隊、入隊、列印佇列、判斷隊空等操作。

#include<bits/stdc++.h>
using namespace std;
struct Node{    
    int Data;    
    struct Node *Next;    
};     
struct QNode{    
    struct Node *rear;    
    struct Node *front;    
};
typedef struct QNode *Queue;  
Queue CreateQueue();
int DeleteQ(Queue PtrQ); 
void InsertQ(int item,Queue PtrQ);
void Print(Queue PtrQ); 
bool IsEmpty(Queue Q);    
int main()    
{    
    /*以下是測試程式碼
    Queue PtrQ=CreateQueue();
    Print(PtrQ);
    InsertQ(1,PtrQ);
    InsertQ(2,PtrQ);
    InsertQ(3,PtrQ);
    Print(PtrQ);
    DeleteQ(PtrQ);
    Print(PtrQ);
    InsertQ(1,PtrQ);
    Print(PtrQ);
    DeleteQ(PtrQ);
    DeleteQ(PtrQ);
    DeleteQ(PtrQ);
    Print(PtrQ);
    */
    return 0;    
}    
Queue CreateQueue(){
	Queue PtrQ;  
    PtrQ=(Queue)malloc(sizeof(struct QNode));
	struct Node *rear;
	struct Node *front;
	rear =(Node*)malloc(sizeof(struct Node));
    rear=NULL;
    front =(Node*)malloc(sizeof(struct Node));
    front=NULL;
	PtrQ->front=front;
	PtrQ->rear=rear;
    return PtrQ;
};
int DeleteQ(Queue PtrQ){    
    struct Node *FrontCell;    
    int FrontElem;    
    if(IsEmpty(PtrQ)){    
        printf("佇列空");    
        return 0;    
    }  
    FrontCell=PtrQ->front;  
    if(PtrQ->front==PtrQ->rear)  
       PtrQ->front=PtrQ->rear=NULL;  
    else{  
        PtrQ->front=PtrQ->front->Next;  
    }  
    FrontElem=FrontCell->Data;  
    free(FrontCell);  
    return FrontElem;    
}    
void InsertQ(int item,Queue PtrQ){  
    struct Node *FrontCell;  
    FrontCell=(Node*)malloc(sizeof(struct Node));
	FrontCell->Data=item;
	FrontCell->Next=NULL;
	if(IsEmpty(PtrQ)){
		PtrQ->front=FrontCell;
		PtrQ->rear=FrontCell;
	}
	else{
		PtrQ->rear->Next=FrontCell;
		PtrQ->rear=FrontCell;
	}
};   
void Print(Queue PtrQ) {      
    struct Node *Q1;      
    Q1 = PtrQ->front;      
    if (Q1 == NULL) {      
        printf("NULL\n");      
        return;      
    }      
    while (Q1 != PtrQ->rear) {      
        printf("%d ", Q1->Data);  
		Q1 =Q1->Next;      
    }  
    printf("%d", Q1->Data);  
    putchar('\n');      
}     
bool IsEmpty(Queue Q){
	 return(Q->front==NULL);  
};