队列实现

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; 
}

 

posted on 2024-10-01 21:12  轩邈、  阅读(5)  评论(0编辑  收藏  举报

导航