持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
前言
计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
代码是用 C++ 写的,全部可以编译运行,尽量包含暴力解和最优解(考试时间不够可以直接怼一个暴力上去,稳拿一半分以上)。
持续更新,目前更新进度:
- 线性表 14/14
- 链表 25/25
- 栈 3/3
- 队列
- ...
仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。
3.1.5, 3
- 题中明确写出栈的初态终态均为空,所以入栈次数和出栈次数应该相同
- 将入栈记为+1,出栈-1,最终结果为0则合法,中间过程中如果有<0的情况即为不合法
- 时间复杂度O(n),空间复杂度O(1)
bool isValid(string str) {
int cnt = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'I') cnt++;
if (str[i] == 'O') cnt--;
if (cnt < 0) return false;
}
if (cnt == 0) return true;
return false;
}
复制代码
4
- 中心对称
- 遍历,用栈存储前一半元素,然后对比后一半元素
- 只需要注意奇偶数个元素的判定即可
- 时间复杂度O(n),空间复杂度O(n/2)
bool isSymmetry(LinkList L, int n) {
char stk[n/2]; // 字符栈
LNode *p = L->next;
// 1.存入链表前一半的元素
for (int i = 0; i < n/2; i++) {
stk[i] = p->data;
p = p->next;
}
// 2.如果链表元素个数为奇数,则中间元素不用比较
if (n % 2 == 1) p = p->next;
// 3.对比后半部分
for (int i = n/2 - 1; i >= 0; i--) {
if (stk[i] != p->data) return false;
p = p->next;
}
return true;
}
复制代码
5
- 共享顺序栈,关键在于两个站入栈和出栈的判定,s1是传统意义上的栈,入栈时栈顶指针+1,s2则相反,入栈时栈顶指针-1,同理可得出栈
- 注意“入栈判满,出栈判空”即可
- 栈满的判断方法是
top2-top1 == 1
#define maxsize 100
typedef struct {
int stack[maxsize];
int top1;
int top2;
} stk;
// 栈的初始化
void initStack(stk &s) {
s.top1 = -1;
s.top2 = maxsize;
}
// 判断栈空
bool isEmpty(stk &s, int num) {
if (num != 1 && num != 2) {
cout << "栈号输入错误" << endl;
return false;
}
if (num == 1) return s.top1 == -1;
return s.top2 == maxsize;
}
// 判断栈满
bool isFull(stk &s) {
if (s.top2 - s.top1 == 1) return true;
return false;
}
// 入栈
bool push(stk &s, int num, int x) {
if (num != 1 && num != 2) {
cout << "栈号输入错误" << endl;
return false;
}
if (isFull(s)) {
cout << "栈满" << endl;
return false;
}
if (num == 1) s.stack[++s.top1] = x;
else s.stack[--s.top2] = x;
return true;
}
// 出栈
bool pop(stk &s, int num, int &x) {
if (num != 1 && num != 2) {
cout << "栈号输入错误" << endl;
return false;
}
if (isEmpty(s, num)) {
cout << "栈空" << endl;
return false;
}
if (num == 1) x = s.stack[s.top1--];
else x = s.stack[s.top2++];
return true;
}
复制代码