AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

数据结构强化 | C++实现《26王道数据结构大题》3.2节队列(更新中)

作者: 作者的头像   t123456789009 ,  2025-06-08 15:30:55 · 北京 ,  所有人可见 ,  阅读 2


0


//队列顺序存储结构
#define maxsize 100

typedef struct{
    ElemType data[maxsize];
    int front,rear;
}Queue;
//队列链式存取结构
typedef struct Node{
    ElemType data;
    struct Node * next;
}Node;

01.若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队首指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队和出队算法。

题目要求的是顺序存储用一个标志来判断空还是满
typedef struct{
    int data[100];
    int front,rear;
    int tag = 0;
}queue;
//初始front和rear分别指向队首元素和队尾元素的下一个位置
//入队时把tag置为1,出队时把tag置为0,因为只有入队后队才可能会满,出队后队才可能空
//初始时tag=0,rear = front = 0;
//所以判断队满的条件就是Q.rear = Q.front&&tag ==1;
bool push(queue&q,int x){
    if(q.front==q.rear&&q.tag==1) return false;
    q.data[q.rear] = x;
    q = (q.rear+1)%Maxsize;
    q.tag = 1;
}

bool pop(queue&q){
    if(q.front==q.rear&&q.tag==0) return false;
    q.front = (q.front+1)%Maxsize;
    q.tag = 0;
    return true;
}

02. Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。

其实就是把Q的元素全部出队并且入栈,然后把栈里面的元素依次弹出再入队

04. [2019统考真题]请设计一个队列,要求满足:①初始时队列为空;②入队时,允许增加队列占用空间;③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减,④入队操作和出队操作的时间复杂度始终保持为0(1)。 请回答:
1)该队列是应选择链式存储结构,还是应选择顺序存储结构?
2)画出队列的初始状态,并给出判断队空和队满的条件。
3)画出第一个元素入队后的队列状态
4)给出入队操作和出队操作的基本过程。

要求允许增加空间,我原来错误地想可以重新分配空间,比如重新new一个数组,但这里要求所占用空间可以重复使用。所以只能用链式存储,下面是答案的做法。
用一个单循环链表,初始时队列为空,rear和front都指向同一个节点。
然后入队时先检查队满:看rear->next和front是否指向同一个节点,如果指向同一个节点,说明队满。
否则让rear.dara = x;rear = rear->next;
出队时让front指向下一个节点就好,如果front==rear,说明队空
答案参考:https://zhuanlan.zhihu.com/p/568802303

3.3.7
01.假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别表达式中的括号是否配对,以字符“\0”作为算术表达式的结束符。

//设置一个栈,按表达式顺序每次从左往右读,如果遇到左括号直接入栈,右括号则找栈顶看是不是相对应的左括号,如果是出栈,否则不匹配
typedef struct stack{

}
bool check(char* str){

}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息