408王道数据结构课后代码习题(廿三)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里

代码是用 C++ 写的,全部可以编译运行,尽量包含暴力解和最优解(考试时间不够可以直接怼一个暴力上去,稳拿一半分以上)。

持续更新,目前更新进度:

  • 线性表 14/14
  • 链表 25/25
  • 栈 3/3
  • 队列
  • ...

仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。

3.1.5, 3

image.png

  • 题中明确写出栈的初态终态均为空,所以入栈次数和出栈次数应该相同
  • 将入栈记为+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

image.png

  • 中心对称
  • 遍历,用栈存储前一半元素,然后对比后一半元素
  • 只需要注意奇偶数个元素的判定即可
  • 时间复杂度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

image.png

  • 共享顺序栈,关键在于两个站入栈和出栈的判定,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;
}
复制代码

猜你喜欢

转载自juejin.im/post/7104274290408685581