佇列實現(順序結構)
阿新 • • 發佈:2018-12-28
順序結構結構
#include <stdio.h>
#include <stdlib.h>
#define QUEUE_SIZE 10
typedef int ElemType;
typedef enum {overflow,underflow,success,fatal}Status;
typedef struct queue{
ElemType *ele;
int head;
int tail;
}Queue,*QueuePtr;
棧操作
- 初始化 :
時間複雜度: O(1)
Status initQueue (QueuePtr *queue_ptr){
Status s = success;
(*queue_ptr) = (QueuePtr) malloc(sizeof(Queue));
if(!queue_ptr) {
s = fatal;
return s;
}
ElemType *tmp = (ElemType *)malloc(sizeof(ElemType)*QUEUE_SIZE);
if(tmp) {
(*queue_ptr)->ele = tmp;
(*queue_ptr)->head = -1;
(* queue_ptr)->tail = -1;
s = success;
}else {
s = fatal;
}
return s;
}
- 清空 :
時間複雜度: O(1)
void clearQueue(QueuePtr queue_ptr){
queue_ptr ->head = -1;
queue_ptr ->tail = -1;
}
- 銷燬 :
時間複雜度: O(1)
void destroyQueue(QueuePtr *queue_ptr){
if (queue_ptr){
free((*queue_ptr)->ele);
(*queue_ptr)->ele = NULL;
free((*queue_ptr));
(*queue_ptr) = NULL;
}
}
- 入佇列 :
時間複雜度: O(1)
Status pushQueue(QueuePtr queue_ptr,int ele){ // 尾部插入
Status s = success;
if(queue_ptr->tail == QUEUE_SIZE - 1) {
s = overflow;
} else {
queue_ptr->tail ++;
queue_ptr->ele[queue_ptr->tail] = ele;
}
return s;
}
- 出佇列 :
時間複雜度: O(1)
Status popQueue(QueuePtr queue_ptr,int *ele){ //頭部刪除
Status s = success;
if(isEmpty(queue_ptr)){
s = underflow;
} else {
*ele = queue_ptr->ele[queue_ptr -> head + 1];
queue_ptr -> head ++;
}
return s;
}
- 判斷佇列滿 :
時間複雜度: O(1)
bool isFull(QueuePtr queue_ptr){
if(queue_ptr->tail == QUEUE_SIZE - 1) return true;
return false;
}
- 判斷佇列空 :
時間複雜度: O(1)
bool isEmpty(QueuePtr queue_ptr){
if(queue_ptr->tail > queue_ptr->head) return false;
return true;
}
- 獲取佇列大小 :
時間複雜度: O(1)
int getlength(QueuePtr queue_ptr){
if(!isEmpty(queue_ptr)) return queue_ptr->tail - queue_ptr->head;
return 0;
}
- 列印佇列 :
時間複雜度: O(1)
void printQueue(QueuePtr queue_ptr){
if(!isEmpty(queue_ptr)) {
printf("head <- tail\n");
for(int i = queue_ptr->head + 1; i <= queue_ptr->tail; i++) {
printf("queue[%d]:%d ",i,queue_ptr->ele[i] );
}
printf("\n");
}
}
問題
浪費空間, 有假溢位情況.