首页 > 代码库 > 第三章算法设计题

第三章算法设计题

 

 

 

3.2.8

/***循环队列基本操作***/
#include<cstdlib>
#include<iostream>
#include<fstream>
using namespace std;

#define MAXQSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;

typedef struct {
  QElemType *base;//初始化时动态分配存储空间
  int front;//头指针
  int rear;//尾指针
} SqQueue;

//算法3.11 循环队列的初始化
Status InitQueue(SqQueue &Q)  //构造一个空队列Q
{
  Q.base = new QElemType[MAXQSIZE]; //为队列分配一个最大容量为MAXSIZE的数组空间
  if(!Q.base)
    exit(OVERFLOW); //存储分配失败
  Q.front = Q.rear = 0; //头指针和尾指针置为零,队列为空
  return OK;
}

bool QueueEmpty(SqQueue Q)
{
  return Q.front == Q.rear;
}

//算法3.12 求循环队列的长度
int QueueLength(SqQueue Q)  //返回Q的元素个数,即队列的长度
{
  return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

//算法3.13 循环队列的入队
Status EnQueue(SqQueue &Q, QElemType e)  //插入元素e为Q的新的队尾元素
{
  if((Q.rear + 1) % MAXQSIZE == Q.front)  //尾指针在循环意义上加1后等于头指针,表明队满
    return ERROR;
  Q.base[Q.rear] = e; //新元素插入队尾
  Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针加1
  return OK;
}

//算法3.14 循环队列的出队
Status DeQueue(SqQueue &Q, QElemType &e)  //删除Q的队头元素,用e返回其值
{
  if(Q.front == Q.rear)
    return ERROR; //队空
  e = Q.base[Q.front]; //保存队头元素
  Q.front = (Q.front + 1) % MAXQSIZE; //队头指针加1
  return OK;
}


//销毁队列Q,Q不再存在
void DestroyQueue(SqQueue &Q)
{
  if(Q.base)
    delete []Q.base;
  Q.base = NULL;
  Q.front = Q.rear = 0;
}

Status dequeue_rear(SqQueue& Q, QElemType &e)
//Q是如上定义的循环队列,本算法实现从队尾删除,若删除成功,返回被删除元素,否则给出出错信息。
{
  if(Q.front == Q.rear)
    return ERROR; // 队空
  Q.rear = (Q.rear - 1 + MAXQSIZE) % MAXQSIZE;  //修改队尾指针。
  e = Q.base[Q.rear]; //返回出队元素
  return OK;
}//从队尾删除算法结束

Status enqueue_front(SqQueue& Q, QElemType x)
// Q是顺序存储的循环队列,本算法实现“从队头插入”元素x。
{
  if(Q.rear == (Q.front - 1 + MAXQSIZE) % MAXQSIZE)
    return ERROR; // 队满
  Q.front = (Q.front - 1 + MAXQSIZE) % MAXQSIZE; //修改队头指针。
  Q.base[Q.front] = x;      //x 入队列
  return OK;
}// 结束从队头插入算法。
int main()
{
  SqQueue Q;
  QElemType e;

  InitQueue(Q);
  enqueue_front(Q, 3);//队列3
  enqueue_front(Q, 4);//队列4 3
  enqueue_front(Q, 5);//队列5 4 3
  DeQueue(Q, e);//队列 4 3
  cout << e << endl; //5
  DeQueue(Q, e);//队列 3
  cout << e << endl; //4
  enqueue_front(Q, 2);//队列 2 3
  enqueue_front(Q, 1);//队列 1 2 3
  dequeue_rear(Q,e);//队列 1 2
  cout << e << endl; //3
  dequeue_rear(Q,e);//队列1
  cout << e << endl; //2



  return 0;
}

 

第三章算法设计题