循环队列例程,vc++2008编译

来源:互联网 发布:思迅商云网络断开 编辑:程序博客网 时间:2024/06/06 23:21

#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include <iomanip>

using std::cin;
using std::cout;
using std::endl;
using std::setw;

typedef unsigned char uint8;
typedef unsigned short uint16;
#define SUCC  1
#define ERR   0

#define RQ_BUF_LEN 5

typedef struct
{
 uint8 *buf;
 uint16 front;
 uint16 rear;
}RQ_BUF;

uint8 InitRQ(RQ_BUF *pstrRq)
{
 pstrRq->buf = (uint8 *)malloc(RQ_BUF_LEN * sizeof(uint8));
 if(pstrRq->buf == NULL)
 {
  return ERR;
 }
 pstrRq->front = 0;
 pstrRq->rear = 0;
 return SUCC;
}

void PrintRQ(RQ_BUF *pstrRq)
{
 uint16 tmp = pstrRq->front;
 uint8 counter = 0;

 while(tmp != pstrRq->rear)
 {
  if(counter++ >= 5)
  {
   cout << endl;
   counter = 0;
  }
  cout << pstrRq->buf[tmp] << setw(5);
  tmp = (tmp + 1) % RQ_BUF_LEN;  
 }

 cout << endl
  << "buf occupied:"
  << (pstrRq->rear - pstrRq->front + RQ_BUF_LEN) % RQ_BUF_LEN
  << '/'
  << RQ_BUF_LEN
  << endl << endl;
}

void EnterRQ(RQ_BUF *pstrRq)
{
 uint8 c;
 uint8 user_set;

 cin >> c;
 if(((pstrRq->rear + 1) % RQ_BUF_LEN) == pstrRq->front)
 {
  //full
  while(1)
  {
   printf("revolve queue is full,enter 'o' to overwrite or 'c' to cancel/n");
   cin >> user_set;
   if(user_set == 'o' || user_set == 'O')
   {
    //overwrite
    pstrRq->front = (pstrRq->front + 1) % RQ_BUF_LEN;
    pstrRq->buf[pstrRq->rear] = c;
    pstrRq->rear = (pstrRq->rear + 1) % RQ_BUF_LEN;
    break;
   }
   else if(user_set == 'c' || user_set == 'C')
   {
    break;
   }
  }  
 }
 else
 {
  pstrRq->buf[pstrRq->rear] = c;
  pstrRq->rear = (pstrRq->rear + 1) % RQ_BUF_LEN;
 }
 PrintRQ(pstrRq);
}

void DelRQ(RQ_BUF *pstrRq)
{
 if(pstrRq->front == pstrRq->rear)
 {
  printf("revolve queue is empty/n");
 }
 else
 {
  pstrRq->front = (pstrRq->front + 1) % RQ_BUF_LEN;
  if(pstrRq->front == pstrRq->rear)
  {
   printf("revolve queue is empty/n");
  }
  else
  {
   PrintRQ(pstrRq);
  }
 }
}

uint8 main(void)
{
 uint8 c;
 RQ_BUF MyRq;
 RQ_BUF *pMyRq = &MyRq;

 if(SUCC == InitRQ(pMyRq))
 {
  while(1)
  {
   printf("Enter 'e' for enter,or 'd' for del/n");
   cin >> c;
   if(c == 'e' || c == 'E')
   {
    EnterRQ(pMyRq);
   }
   else if(c == 'd' || c == 'D')
   {
    DelRQ(pMyRq);
   }
  }
 }
 else
 {
  printf("Insufficient memory available/n");
 }
}