队列(c语言)

队列:

限定所有的插入操作在表的一端进行,而 删除操作在表的另一端进行的线性表。

允许进行插入操作的一端称为队尾 (rear),

允许进行删除操作的一端称为队头(front)

 

1.队列类型的定义

#define MAX 50
typedef struct
{
    ElemType data[MAX];
    int front,rear;//front为队首指针  rear为队尾指针
}SqQueue;
   typedef int ElemType;
   typedef SqQueue CSqQueue;

2.初始化运算

/*初始化运算得到一个空队列*/
int InitQueue(CSqQueue *Q)
{
   (*Q).front=0;
   (*Q).rear=0;
   return 0;
}

3.判空运算的实现

/*判断运算,队列Q为空返回1,否则返回0*/
int QueueEmpty(CSqQueue Q)
{
   if(Q.front==Q.rear)
       return 1;
   return 0;
}

4.判满运算的实现

int QueueFull(CSqQueue Q)
{
    if((Q.rear+1)%MAX==q.front)
       return 1;
    return 0;
}

5.创建运算的实现

/*创建一个队列,创建成功返回1,创建失败返回0*/
int CreatQueue(CSqQueue *Q)
{
   int i,n;
   ElemType temp_e;
   printf("Please input the length of the queue which you want to creat:\n");
   scanf("%d",&n);
   if(n>MAX)
      return -1;
   for(i=1;i<=n,i++){
      printf("Please input NO.%d enter element:\n",i); 
      scanf("%d",&temp_e);
      EnQueue(Q,temp_e); 
  }
  return 0;
}

6.求长度运算的实现

/*返回队列长度*/
int QueueLength(CSqQueue Q)
{
   return (Q.rear-Q.front+MAX)%MAX;
}

7.访问队首运算的实现

/*返回队首元素的值*/
int GetHead(CSQqueue Q,ElemType *e)
{
   if(QueueEmpty(Q))
   {
      return-1;
   }
   *e=Q.data[Q.front];
   return 0;
}

8.入队的实现

/*队尾插入新元素*/
int EnQueue(CSqQueue *Q,ElemType *e)
{
   if(QueueEmpty(*Q))
   {
      return-1;
   }
   (*Q).data[(*Q).rear]=e;
   (*Q).rear=((*Q).rear+1)%MAX;
   return 0;
}

9.出队的实现

/*删除队首,并用变量e返回被删除元素*/
int DeQueue(CSqQueue *Q,ElemType *e)
{
   if(QueueEmpty(*Q))
   {
      return-1;
   }
   e=(*Q).data[(*Q).front)];
   (*Q).front=((*Q).front+1)%MAX;
   return 0;
}

10.打印运算的实现

/*输出队列Q*/
void ShowQueue(CSqQueue Q)
{
   ElemType temp_e;
   while (!=QueueEmpty(Q))
   {
       DeQueue(&Q,&temp_e);
       printf("%d",temp_e)
   }
   printf("\n");
}

 

#include #include #include //队列最大长度 #define MAX_QUEUE 1024 //偷懒,就用静态队列了 static int mQueue[MAX_QUEUE]; //队列插入 void InsertData(int **Front, int **Rear) { if (*Rear + 1 == *Front && (*Rear + 1 - MAX_QUEUE != *Front)) { //当队列数据已满,返回 puts("Queue Size Overflow!\n"); return; } else if (*Rear - mQueue > MAX_QUEUE) { //实现的是类似循环队列,但由于是静态线性队列(数组) //而不是用链来实现的,所以到静态队列(数组)尾部,尾指针自动指向(数组)头部 *Rear = mQueue; } puts("Input Data:"); scanf("%d", *Rear); //输入数据后,尾指针后移 *Rear += 1; } //从头指针删除一个队列中的数据 void DeleteData(int **Front, int **Rear) { if (*Front == *Rear) { //头指针尾指针重合,队列空,不能删除,返回 puts("Queue Empty!\n"); return; } else if (*Front - mQueue > MAX_QUEUE) { //参考 Rear *Front = mQueue; } //从头指针删除一个数据 *Front += 1; } //显示队列数据 void ShowData(int **Front, int **Rear) { int *temp; for (temp=*Front; temp!=*Rear; temp++) { printf("%d --> ", *temp); } puts("\n"); } void usage(void) { puts("1. Insert Data"); puts("2. Delete Data"); puts("3. Show Data"); } int main(int argc, char **argv) { //头指针,尾指针 //队列的一个特性 First in first out FIFO int *pFront, *pRear; int op_code; //初始化队列,头指针和尾指针此时指向的地址相同 pFront = pRear = mQueue; while (1) { usage(); scanf("%d", &op_code); switch (op_code) { case 1: printf("%p\n", pFront); printf("%d\n", *pFront); InsertData(&pFront, &pRear); break; case 2: DeleteData(&pFront, &pRear); break; case 3: ShowData(&pFront, &pRear); break; default: break; } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值