提示:本文仅做简单介绍,部分图来自网络,侵删
一、栈
栈stack
:限定在表尾进行插入和删除操作的线性表,这种结构又称为先进后出的线性表,表尾称栈顶,表头称栈底,不含任何元素称空栈。
栈的基本操作
InitStack(); // 初始化
DestoryStack(); // 销毁
ClearStack(); // 清空栈
StackEmpty(); // 判断栈是否为空
StackLength(); // 栈的长度
GetTop(); // 返回栈顶元素
Push(); // 元素入栈
Pop(); // 元素出栈
StackTraverse(S, visit()); // 对栈中每个元素调用visit(),visit()失则操作失败
栈的表示
struct Stack{
ElemType *base; // 指向栈底
ElemType *top; // 指向栈顶
int StackSize; // 栈的大小
}
二、栈的应用
非负十进制转八进制
void conversation(unsigned int &N) {
stack<unsigned int> S;
while(N) {
S.push(N % 8);
N /= 8;
}
while(!S.empty()) {
S.pop();
}
}
leecode 20 有效括号
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for(char ch:s) {
if(ch == '(') {
stk.push(')');
}
else if(ch == '[') {
stk.push(']');
}
else if(ch == '{') {
stk.push('}');
}
else{
if(stk.empty() || stk.top() != ch) {
return false;
}
else {
stk.pop();
}
}
}
return stk.empty();
}
};
三、栈与递归
Fibonacci
数列
class Solution {
public:
int fib(int n) {
if(0 == n) return 0;
if(1 == n) return 1;
return fib(n - 1) + fib(n - 2);
}
};
n
阶 Hanoi
塔
void hanoi(int n, char x, char y, char z) {
// x --> z
if(n == 1) {
move(1, x, z); // 将编号1的圆盘从x移动到z
}
else {
hanoi(n - 1, x, z, y); // 将1~(n-1) 个圆盘从x移动到y, z辅助
move(n, x, z); // 将编号n的圆盘从x移动到z
hanoi(n - 1, y, x, z); // 将1~(n-1) 个圆盘从y移动到z, x辅助
}
}
四、队列
队列queue
:一种先进先出的线性表,只允许在表的一端插入,在另一端删除。
基本操作
InitQueue(); // 初始化一个队列
DestoryQueue(); // 销毁一个队列
CLearQueue(); // 清空队列
QueueEmpty(); // 判断队列是否为空
QueueLength(); // 返回队列长度
GetHead(); // 返回队头
EnQueue(); // 队尾插入
DeQueue(); // 删除队头
QueueTraverse(Q, visit()); // 对队列中每个元素调用visit(),visit()失则操作失败
链队列
循环队列