关于#c语言#的问题:循环队列本质上是一个环形结构,保存元素的数组的实际大小比队列的容量小1

该问题来自社区帖: https://bbs.csdn.net/topics/614854849.为符合问答规范, 该问题经过ChatGPT优化

动态数组和栈

使用new创建动态数组时需要指定元素类型和元素个数,格式为typeName * pointer_name = new typeName[num_elements]。创建完成后,通过指针变量指向第一个元素,可以操作整个数组。释放使用new创建的数组应使用delete []

栈是一种操作受限制的线性表,仅允许在表尾进行插入或删除操作,栈顶指向最后一个插入的元素。栈的顺序存储结构可以使用数组实现,初始化时需要指定栈的最大容量。元素的插入和删除分别对应入栈和出栈操作。

代码示例:

#define STACK_INIT_SIZE 100 // 栈的初始化大小
#define STACKINCREMENT 10 // 栈空间不够时,追加的增量
//定义栈元素类型
typedef struct{
    int data;
}SElemType;
//定义栈,包含栈底指针、栈顶指针和栈的大小
typedef struct{
    SElemType * base; // 栈底指针
    SElemType * top; // 栈顶指针
    int stacksize; // 栈的大小
}SqStack;
//初始化栈,成功返回OK
Status InitStack(SqStack &S)
{
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElenType));
    if(!S.base) exit(OVERFLOW); // 内存分配失败
    S.top = S.base; // 开始时栈顶和栈底相同
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
//插入元素e为新的栈顶元素,成功返回OK
Status Push(SqStack &S, SElemType e)
{
    if(S.top - S.base >= S.stacksize) // 栈空间不够,追加STACKINCREMENT个元素空间
    {
        S.base = (SElemType *)realloc(S.base,
        (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base) exit(OVERFLOW);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e; // 元素入栈
    return OK;
}
//出栈,成功返回OK
Status Pop(SqStack &S, SElemType &e)
{
    if(S.top == S.base) return ERROR; // 栈为空
    e = * --S.top; // 元素出栈
    return OK;
}

队列

队列是一种先进先出(FIFO)的线性表,由队列头和队列尾两个指针来表示。队列操作有入队和出队操作。为了保证高效地进行入队和出队操作,通常使用循环队列来实现队列的顺序存储结构。循环队列本质上是一个环形结构,保存元素的数组的实际大小比队列的容量小1。

代码示例:

#define MAXSIZE 100 // 队列的最大容量
//定义队列元素类型
typedef struct{
    int data;
}QElemType;
//定义队列,包含队头指针、队尾指针和队列的大小
typedef struct{
    QElemType * base; // 队头指针
    int front; // 队头指针所在的数组下标
    int rear; // 队尾指针所在的数组下标
    int size; // 队列中元素的个数
}SqQueue;
//初始化队列,成功返回OK
Status InitQueue(SqQueue &Q)
{
    Q.base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));
    if(!Q.base) exit(OVERFLOW);
    Q.front = Q.rear = 0;
    Q.size = 0;
    return OK;
}
//插入元素e为新的队尾元素,成功返回OK
Status EnQueue(SqQueue &Q, QElemType e)
{
    if((Q.rear + 1) % MAXSIZE == Q.front) return ERROR; // 队列已满
    Q.base[Q.rear] = e; // 元素入队
    Q.rear = (Q.rear + 1) % MAXSIZE;
    Q.size ++;
    return OK;
}
//出队,成功返回OK
Status DeQueue(SqQueue &Q, QElemType &e)
{
    if(Q.front == Q.rear) return ERROR; // 队列为空
    e = Q.base[Q.front]; // 元素出队
    Q.front = (Q.front + 1) % MAXSIZE;
    Q.size --;
    return OK;
}

你知道为什么你的问题没人回答么?因为没有悬赏
有了悬赏,那些你们养的蛊就都来了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/381974
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想

  • 以下回答来自chatgpt:

    我不理解您的问题,请提供更具体的信息。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^