Notes for Lecture 4


Vector的嵌套


ADT

What is it?

抽象数据类型 (ADT);数据集合和定义在该数据集合上的操作规范

Stack

定义:

应用:

#include"stack.h"

  • size()方法返回值会动态变化,当用作条件判断时需注意是否需要使用初始长度or动态长度

栈的练习:

  • 匹配思想:

  • 从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。

Answer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int check(string str)
{
Stack <char> stack;
int len = str.length();
for (int i = 0; i < len; i++)
{
if (str[i] == '(' || str[i] == '{')
{
stack.push(str[i]); //左(花)括号均压入栈
}
else if (str[i] == ')' || str[i] == '}') //将右(花)括号与栈中左花括号匹配
{
if (!stack.isEmpty() && stack.peek() == str[i]) //弹出栈顶元素是需判断栈是否为空
{
stack.pop();
}
else if (!stack.isEmpty() && stack.peek() != str[i)
{
return i;
}
}
}
if (!stack.isEmpty) //通过判断栈是否为空来判断是否存在左(花)括号的case
{
return len;
}else
return -1;
}

Quene

定义:

应用:

#include"quene.h"

  • size()方法返回值会动态变化,当用作条件判断时需注意是否需要使用初始长度or动态长度

队列的练习:

  • 匹配思想:

  • 队列与栈的交互
    栈暂存队列弹出的元素
    队列弹出元素同时重新压回本身,恢复原状态
    将栈中元素重新压入队列(LIFO)

Answer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void mirror(Quene<string>& quene)
{
int len = quene.size(); //记录队列长度
Stack <string> stack;
for (int i = 0; i < len; i++)
{
string elem = quene.dequene();
quene.enquene(elem); //恢复
stack.push(elem);
}
while (!stack.isEmpty())
{
quene.enquene(stack.pop());
}
}