队列实现
1、数组实现队列
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 10 /*定义队列的大小*/
int main()
{
int front,rear,val,queue[MAX]={0};
char choice;
front=rear=-1;
while(rear<MAX-1 && choice!='e')
{
printf("[a]表示加入一个数据,[d]表示取出一个数据,[e]表示跳出此程序:");
choice=getche();
switch(choice)
{
case 'a':
printf("\n[请输入数据]:");
scanf("%d",&val);
rear++;
queue[rear]=val;
break;
case 'd':
if(rear>front)
{
front++;
printf("\n[从队列中取出的数据为]: [%d]\n",queue[front]);
queue[front]=0;
}
else
{
printf("\n[队列已经空了]\n");
exit(0);
}
break;
default:
printf("\n");
break;
}
}
printf("\n------------------------------------------\n");
printf("[输出队列中的所有数据]:");
if(rear==MAX-1)
printf("[队列已满]\n");
else if (front>=rear)
{
printf("没有\n");
printf("[队列已空]\n");
}
else
{
while (rear>front)
{
front++;
printf("[%d] ",queue[front]);
}
printf("\n");
printf("------------------------------------------\n");
}
printf("\n");
system("pause");
return 0;
}
2、链表实现队列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int enqueue(char*, int); /* 把数据加入队列*/
int dequeue(); /* 从队列中取出数据 */
int show(); /* 显示队列中的数据 */
struct student
{
char name[20];
int score;
struct student *next;
};
typedef struct student s_data;
s_data *front =NULL;
s_data *rear = NULL;
int main()
{
int select, score;
char name[20];
do
{
printf("(1)加入 (2)取出 (3)显示 (4)离开 => ");
scanf("%d", &select);
switch (select)
{
case 1:
printf("姓名 成绩:");
scanf("%s %d", name, &score);
enqueue(name, score);
break;
case 2:
dequeue();
break;
case 3:
show();
break;
}
} while (select != 4);
system("pause");
return 0;
}
int enqueue(char* name, int score)
{
s_data *new_data;
new_data = (s_data*) malloc(sizeof(s_data)); /* 分配内存给队列的新元素 */
strcpy(new_data->name, name); /* 设置队列新元素的数据 */
new_data->score = score;
if (rear == NULL) /* 如果rear为NULL,表示这是队列的第一个元素 */
front = new_data;
else
rear->next = new_data; /* 将新元素连接至队列末尾*/
rear = new_data; /* 将rear指向新元素,这是新的队列末尾*/
new_data->next = NULL; /* 新元素之后无其他元素 */
}
int dequeue()
{
s_data *freeme;
if (front == NULL)
puts("队列已空!");
else
{
printf("姓名:%s\t成绩:%d ....取出\n", front->name, front->score);
freeme = front; /* 设置指向将要释放的队列元素的指针 */
front = front->next; /* 将队列前端移至下一个元素 */
free(freeme); /* 释放所取出的队列元素所占用的内存 */
}
}
int show()
{
s_data *ptr;
ptr = front;
if (ptr == NULL)
puts("队列已空!");
else
{
puts("front -> rear");
while (ptr != NULL) /* 从front到rear遍历队列 */
{
printf("姓名:%s\t成绩:%d\n", ptr->name, ptr->score);
ptr = ptr->next;
}
}
}
3、双向队列
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
typedef struct Node QueueNode;
typedef QueueNode *QueueByLinkedList;
QueueByLinkedList front=NULL;
QueueByLinkedList rear=NULL;
void enqueue(int value) /*函数enqueue:队列数据的加入*/
{
QueueByLinkedList node; /*建立节点*/
node=(QueueByLinkedList)malloc(sizeof(QueueNode));
node->data=value;
node->next=NULL;
/*检查是否为空队列*/
if (rear==NULL)
front=node; /*新建立的节点成为第1个节点*/
else
rear->next=node; /*将节点加入到队列的末尾*/
rear=node; /*将队列的末尾指针指向新加入的节点*/
}
int dequeue(int action) /*方法dequeue:队列数据的取出*/
{
int value;
QueueByLinkedList tempNode,startNode;
/*从队列前端取出数据*/
if (!(front==NULL) && action==1)
{
if(front==rear) rear=NULL;
value=front->data; /*将队列数据从前端取出*/
front=front->next; /*将队列的前端指针指向下一个*/
return value;
}
/*从队列末尾取出数据*/
else if(!(rear==NULL) && action==2)
{
startNode=front; /*先记下队列前端的指针值*/
value=rear->data; /*取出队列当前末尾的数据*/
/*查找队列末尾节点的前一个节点*/
tempNode=front;
while (front->next!=rear && front->next!=NULL)
{
front=front->next;
tempNode=front;
}
front=startNode; /*记录从队列末尾取出数据后的队列前端指针*/
rear=tempNode; /*记录从队列末尾取出数据后的队列末尾指针*/
/*下一行程序是指当队列中仅剩下最后一个节点时,
取出数据后便将front和rear指向NULL*/
if ((front->next==NULL) || (rear->next==NULL))
{
front=NULL;
rear=NULL;
}
return value;
}
else return -1;
}
int main()
{
int temp,item;
char ch;
printf("以链表来实现双向队列\n");
printf("====================================\n");
do
{
printf("加入请按 a,取出请按 d,结束请按 e:");
ch=getche();
printf("\n");
if(ch=='a')
{
printf("加入的数据:");
scanf("%d",&item);
enqueue(item);
}
else if(ch=='d')
{
temp=dequeue(1);
printf("从双向队列前端按序取出的数据为:%d\n",temp);
temp=dequeue(2);
printf("从双向队列末尾按序取出的数据为:%d\n",temp);
}
else
break;
} while(ch!='e');
system("pause");
return 0;
}