链式结构
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef enum {underflow, success, fatal} Status;
typedef struct node{
ElemType ele;
struct node * next;
}Node,*NodePtr;
typedef struct queue{
Node* head;
Node* 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;
}
NodePtr tmp = (NodePtr) malloc(sizeof(Node));
if(tmp) {
tmp -> next = NULL;
(*queue_ptr) -> head = tmp;
(*queue_ptr) -> tail = tmp;
} else{
s = fatal;
}
return s;
}
- 清空 :
时间复杂度: O(1)
void clearQueue(QueuePtr queue_ptr){
queue_ptr ->head = NULL;
queue_ptr ->tail = NULL;
}
- 销毁 :
时间复杂度: O(1)
void destroyQueue(QueuePtr *queue_ptr){
NodePtr freeNode = (*queue_ptr) -> head -> next;
while(freeNode){
(*queue_ptr) -> head = freeNode->next;
free(freeNode);
freeNode = (*queue_ptr)->head->next;
}
freeNode = NULL;
free((*queue_ptr));
(*queue_ptr) = NULL;
}
- 入队列 :
时间复杂度: O(1)
Status pushQueue(QueuePtr queue_ptr, ElemType ele){
Status s = success;
NodePtr newNode = (NodePtr)malloc(sizeof(Node));
if (newNode){
newNode ->ele = ele;
newNode ->next = NULL;
queue_ptr ->tail ->next = newNode;
queue_ptr ->tail = newNode;
} else {
s = fatal;
}
return s;
}
- 出队列 :
时间复杂度: O(1)
Status popQueue(QueuePtr queue_ptr,ElemType *ele) {
Status s = success;
if(isEmpty(queue_ptr)){
s = underflow;
} else {
Node *deleteNode = queue_ptr -> head -> next;
*ele = deleteNode -> ele;
queue_ptr -> head -> next = deleteNode -> next;
free(deleteNode);
deleteNode = NULL;
if(queue_ptr->head->next == NULL){ //该队列只有一个元素
queue_ptr -> tail = queue_ptr -> head;
}
}
return s;
}
- 判断队列空 :
时间复杂度: O(1)
bool isEmpty(QueuePtr queue_ptr){
if(queue_ptr->head == queue_ptr -> tail) return true;
return false;
}
- 获取队列大小 :
时间复杂度: O(1)
int getLength(QueuePtr queue_ptr){
if(!isEmpty(queue_ptr)) {
int count = 0;
NodePtr tmp = queue_ptr-> head ->next;
while(tmp) {
count ++;
tmp = tmp->next;
}
return count;
}
return 0;
}
- 打印队列 :
时间复杂度: O(1)
void printQueue(QueuePtr queue_ptr) {
if(!isEmpty(queue_ptr)) {
printf("head <- tail\n");
NodePtr tmp = queue_ptr->head->next;
while(tmp){
printf("%d ", tmp->ele);
tmp = tmp->next;
}
printf("\n");
}
}
问题解决
- 不用提前分配队列长度.