持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
前言
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
代码是用 C++ 写的,全部可以编译运行,尽量包含暴力解和最优解(考试时间不够可以直接怼一个暴力上去,稳拿一半分以上)。
持续更新,目前更新进度:
- 线性表 14/14
- 链表 25/25
- 栈 3/3
- 队列 4/4
- 栈和队列的应用
- ...
仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。
3.2.6, 1
- 队空:
Q.front == Q.rear && Q.tag == 0
- 队满:
Q.front == Q.rear && Q.tag == 1
- 因为只有进队操作会导致队满,所以在进队时将tag置为1,同理在出队时将tag置为0
bool enqueue(Queue &Q, int x) {
if (Q.front == Q.rear && Q.tag == 1) {
cout << "队列满" << endl;
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % maxsize;
Q.tag = 1;
return true;
}
bool dequeue(Queue &Q, int &x) {
if (Q.front == Q.rear && Q.tag == 0) {
cout << "队列空" << endl;
return false;
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % maxsize;
Q.tag = 0;
return true;
}
复制代码
2
- 队内元素逐个出队入栈,全部入栈后再逐个出栈入队列即可
- 非常简单的一道题,就是考察“先进先出”以及“后进先出”的性质
void reverseQueue(Queue &Q, Stack &S) {
int x;
while (!isEmpty(Q)) {
dequeue(Q, x);
push(S, x);
}
while (!isEmpty(S)) {
pop(S, x);
enqueue(Q, x);
}
}
复制代码
3
- S1的入栈用作入队,若S1满且S2空,才能将S1的元素插入S2中
- S2的出栈用作出队,若S2空,将S1的所有元素插入S2中
- 判空只需要判断两个栈是否都为空
bool Enqueue(Stack &S1, Stack &S2, int x) {
if (!StackOverflow(S1)) {
Push(S1, x);
return true;
}
if (StackOverflow(S1) && !StackEmpty(S2)) {
cout << "队列满" << endl;
return false;
}
// S1满且S2空,先将S1中的元素全部入S2,再入S1
while (!StackEmpty(S1)) {
int tmp;
Pop(S1, tmp);
Push(S2, tmp);
}
Push(S1, x);
return true;
}
bool Dequeue(Stack &S1, Stack &S2, int &x) {
if (!StackEmpty(S2)) {
Pop(S2, x);
return true;
}
if (StackEmpty(S1)) {
cout << "队列空" << endl;
return false;
}
// S2为空且S1不为空
while (!StackEmpty(S1)) {
int tmp;
Pop(S1, tmp);
Push(S2, tmp);
}
Pop(S2, x);
return true;
}
bool QueueEmpty(Stack S1, Stack S2) {
return StackEmpty(S1) && StackEmpty(S2);
}
复制代码
4
- 如题,应选择链式存储结构,且为包含头尾指针的单循环链表(头front,尾rear)
- 队空条件
front == rear
- 队满条件
front == rear -> next
- 遵循”入判满,出判空“的原则,写出伪代码即可