您的位置:首页 > 职场人生

(程序员面试题)链队列的基本操作

2014-03-30 16:49 204 查看
队列的基本操作跟栈类似,有如下几种:入队列,出队列,判断队列满,判断队列空,遍历队列。

但是跟栈不一样的是:栈的入栈和出栈操作始终是在栈顶,但是队列的入队列是在队列尾部,出队列是在队列的头部。

详情请见testcase:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define QUEUE_MAX 3

typedef struct queue {
char data[10];
struct queue *next;
} *qu_ptr;

void print_queue(qu_ptr front) {
qu_ptr tmp = front;
while (tmp->next) {
printf("%s\n", tmp->next->data);
tmp = tmp->next;
}
printf("\n");
}

int is_queue_empty(qu_ptr front, qu_ptr rear) {
if ((front->next == NULL) && (rear->next == NULL)) {
printf("queue empty\n");
return 0;
}
return -1;
}

int is_queue_full(qu_ptr front) {
qu_ptr tmp  = front;
int cur = 0;
while (tmp->next) {
cur++;
tmp = tmp->next;
}

if (cur == QUEUE_MAX) {
printf("queue full\n");
return 0;
}
return -1;
}

int add_queue(qu_ptr front, qu_ptr rear, qu_ptr add) {
if (is_queue_full(front) == 0) {
printf("queue full, can not add\n");
return -1;
}

if (is_queue_empty(front, rear) == 0) {
rear->next = add;
front->next = add;
add->next = NULL;
return 0;
}

rear->next->next = add;
rear->next = add;
add->next = NULL;
return 0;
}

int del_queue(qu_ptr front, qu_ptr rear) {
if (is_queue_empty(front, rear) == 0) {
printf("queue empty, can not del\n");
return -1;
}

if (front->next == rear->next) {
front->next = NULL;
rear->next = NULL;
return 0;
}

front->next = front->next->next;
return 0;
}

int main()
{
qu_ptr front, rear, cheny, cherry, new, test;
front = (qu_ptr)malloc(sizeof(struct queue));
rear = (qu_ptr)malloc(sizeof(struct queue));
cheny = (qu_ptr)malloc(sizeof(struct queue));
cherry = (qu_ptr)malloc(sizeof(struct queue));
new = (qu_ptr)malloc(sizeof(struct queue));
test = (qu_ptr)malloc(sizeof(struct queue));

// this is an empty queue
front->next = NULL;
rear->next = NULL;

strcpy(cheny->data, "cheny");
add_queue(front, rear, cheny);
print_queue(front);

strcpy(cherry->data, "cherry");
add_queue(front, rear, cherry);
print_queue(front);

strcpy(new->data, "new");
add_queue(front, rear, new);
print_queue(front);

strcpy(test->data, "test");
add_queue(front, rear, test);
print_queue(front);

del_queue(front, rear);
print_queue(front);

del_queue(front, rear);
print_queue(front);
del_queue(front, rear);
print_queue(front);
del_queue(front, rear);

return 0;
}


运行结果如下:

queue empty

cheny

cheny

cherry

cheny

cherry

new

queue full

queue full, can not add

cheny

cherry

new

cherry

new

new

queue empty

queue empty, can not del

程序的大致意思是:建立一个空队列,然后一次入队列4个,前3个入队列正常,由于队列空间只有3,所以第4个会入队列失败(这个有打印哦),然后依次出队列4个,前3个出队列正常,第4个出队列失败。

入队列和出队列的函数各有一种特殊情况需要判断:

出队列:出队列是从头部出的,理论上来说跟尾部没有关系,但是当队列中只有一个元素的时候,出队列完毕之后队列会变为空队列,此时头部和尾部都需要指向NULL,所以需要尾部的参与

入队列:入队列是从尾部入的,理论上来说跟头部没有关系,但是当队列中没有元素的时候,入队列完毕会让头部和尾部都指向同一个元素,所以需要头部的参与
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: