实现一个顺序存储的队列2020-12-01

Educator错题

实现一个顺序存储的队列

为了操作去思考
#首先,我得定义一个顺序存储的队列

struct SeqQueue {
    T* data; // 指向数据元素数组的指针
    int front; // 下一个出队元素的数组下标
    int rear; // 下一个入队元素应该存放的单元的数组下标
    int max;  // 队列中最多可放max-1个数据元素,留一个空数据单元以区分空和满
};

这个图也许可以帮助我理解???不过现在完全没感觉!

在此基础上,我需要定义对于队列的操作,如出队、进队、判断是否为满、是否为空。(这里对于队列的定义和对于操作的定义需不需要放在一个文件里,我还有点迷糊)

SeqQueue* SQ_Create(int maxlen)void SQ_Free(SeqQueue* sq)void SQ_MakeEmpty(SeqQueue* sq);
bool SQ_IsEmpty(SeqQueue* sq);
bool SQ_IsFull(SeqQueue* sq)int SQ_Length(SeqQueue* sq);
bool SQ_In(SeqQueue* sq, T x);
bool SQ_Out(SeqQueue* sq, T& item);
bool SQ_Head(SeqQueue* sq, T& head)void SQ_Print(SeqQueue* sq)//这操作多的我哭了

具体的每个操作如何做
在每个内部进行定义

bool SQ_IsEmpty(SeqQueue* sq)
// 判断队列是否为空,为空返回true,否则返回false。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    
    /********** End **********/
}
bool SQ_IsFull(SeqQueue* sq)
// 判断队列是否为满。为满返回true,否则返回false。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    
    /********** End **********/
}
int SQ_Length(SeqQueue* sq)
// 队列长度
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    原:return sq->rear;
    对:return (sq->rear-sq->front+sq->max)%sq->max;
    /********** End **********/
}
bool SQ_In(SeqQueue* sq, T x)
// 将x入队。若入队失败(队列满),则返回false,否则返回true。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    我的: if(SQ_IsFull(sq)) 
      {
      return false; 
         }
      else
      {
        sq->rear++;
        if(sq->rear>sq->max-1)
        {sq->rear=0;}
        return true; }
    /********** End **********/
    正确:
     if(SQ_IsFull(sq)) 
 {
  return false; 
 }
    else
 {
        T* head=sq->data;
        head[sq->rear]=x;
        sq->rear=(sq->rear+1)%sq->max;
        return true;
    }
}
bool SQ_Out(SeqQueue* sq, T& item)
// 从队列sq出队一个元素,返回时item为出队的元素的值。若出队成功(队列不为空),则返回true,否则(队列空),返回false,此时item不会返回有效值。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    我的:
    if(SQ_IsEmpty(sq)) 
 {
  return false;
 }
    else
 {
        sq->front++;
        if(sq->front>sq->max-1)
        sq->front=0;
        return true;
    }
    正确的:
    if(SQ_IsEmpty(sq)) 
 {
  return false;
 }
    else
 {
        T* head=sq->data;
        item=head[sq->front];
        sq->front=(sq->front+1)%sq->max;//记得加sq->不要疏忽大意
        return true;
    }
    /********** End **********/
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序循环队列可以用数组来实现,我们可以定义一个数组来表示队列,再定义队首和队尾指针来指示队列的头和尾。在队列为空的时候,队首和队尾指针相等,当队列满时,队尾指针会指向数组的最后一个元素,而队首指针会指向数组的第一个元素。队列的基本操作包括入队和出队。 杨辉三角是一个数学上的图形,由于它的特殊性质,它也可以用队列实现。具体实现方法如下: 1. 定义一个二维数组来存储杨辉三角的数值,同时定义一个队列来存储每一行的数值。 2. 首先将第一行的数值入队,然后从队列中取出队首元素,根据它可以计算出下一行的数值。 3. 将下一行的数值入队,重复上述操作,直到计算到第n行为止。 下面是代码实现: ```c #include <stdio.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; // 存储队列元素 int front; // 队首指针 int rear; // 队尾指针 } SqQueue; // 初始化队列 void InitQueue(SqQueue *q) { q->front = q->rear = 0; } // 判断队列是否为空 int QueueEmpty(SqQueue *q) { return q->front == q->rear; } // 入队 int EnQueue(SqQueue *q, int x) { if ((q->rear + 1) % MAXSIZE == q->front) return 0; // 队列已满 q->data[q->rear] = x; q->rear = (q->rear + 1) % MAXSIZE; return 1; } // 出队 int DeQueue(SqQueue *q, int *x) { if (q->front == q->rear) return 0; // 队列为空 *x = q->data[q->front]; q->front = (q->front + 1) % MAXSIZE; return 1; } // 输出杨辉三角 void PrintTriangle(int n) { int triangle[MAXSIZE][MAXSIZE]; SqQueue q; InitQueue(&q); // 计算杨辉三角的数值 for (int i = 0; i < n; i++) { // 将第一行的数值入队 EnQueue(&q, 1); // 计算当前行的数值 for (int j = 0; j <= i; j++) { if (j == 0 || j == i) triangle[i][j] = 1; else { int x, y; // 取出队首元素和它的下一个元素 DeQueue(&q, &x); DeQueue(&q, &y); triangle[i][j] = x + y; // 将计算得到的数值入队 EnQueue(&q, y); } // 将当前行的数值入队 EnQueue(&q, triangle[i][j]); printf("%d ", triangle[i][j]); } printf("\n"); } } int main() { int n; printf("Please input the number of rows of the triangle: "); scanf("%d", &n); PrintTriangle(n); return 0; } ``` 这个程序可以输出指定行数的杨辉三角,例如输入6,输出结果如下: ``` Please input the number of rows of the triangle: 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值