0

我正在尝试实现一个采用结构的循环队列

  • ⟶ 如果没有入队,则检查队列是否已满 ⟶ 否则返回 0
  • ⟶ 检查队列是否为空,如果没有出队 ⟶ 否则返回 0

以下是我的代码:

    #ifndef_QUEUE_H_
    #define QUEUE_H_
    #define QUEUE_SIZE 32

    typedef struct queue 
    {
      int head;
      int tail;
      int buffer[QUEUE_SIZE];
    } queue_t;

    void init_queue(queue_t *);
    int enqueue(queue_t *, int);
    int isfull(queue_t *);
    int dequeue(queue_t *);            
    int queue_empty(queue_t *);            


    #endif
    /* queue.h ends here */


    /* *************************queue.c starts here************************ */
    #include<queue.h>
    #include<stm32f30x.h>

    #define QUEUE_SIZE 32

    int head;
    int tail;

    void init_queue(queue_t *q)
    {
      q->head = 0;
      q->tail = 0;
    }

    int enqueue(queue_t *q, int a )
    {
      if ((((q->head)+1)%QUEUE_SIZE)!=q->tail) 
        {
          q->buffer[q->head]=a;
          q->head=(((q->head)+1)%QUEUE_SIZE);
          return 1 ;
         }
     else 
         {  
            return 0 ;
         }

     }

    int dequeue(queue_t *q)
     {
      int temp ;
      if (queue_empty(q)) 
         {
           return 0;
          }
      else
        {
          temp = q->buffer[q->tail];
          q->tail=((q->tail)+1)%QUEUE_SIZE;
          return temp;
        }

    }

    int queue_empty(queue_t *q)
    {
      if (q->head == q->tail)
        {
          return 1;
        }
      return 0;
    }

    /* **************queue.c ends here********************** */

当我尝试测试队列时:示例输入“hello”并尝试打印其中的内容,它会打印“ello hlo elo..”和此类不正确的回复。

我在 getchar 和 putchar 函数中使用 enqueue 和 dequeue 函数。下面是我的 getchar 和 putchar 函数:

queue_t rxbuf;
queue_t txbuf;
int putchar(int c) 
{

   while(!(enqueue(&txbuf, c)));
}

int nonblockgetchar(void)
{
  dequeue(&rxbuf);
}


int getchar(void) 
{
  int ch;
  while (!(ch=dequeue(&rxbuf)));
  return (ch);
}

感谢您的时间和帮助。

4

0 回答 0