一、栈和队列的特点:
- 栈:后进先出;
- 队列:先进先出;
二、栈、队列和双端队列的区别
- 栈:只允许从一端插入和删除的线性表;
- 队列:只允许从一段插入、另一端删除的线性表;
-
双端队列:只允许从两端插入、两端删除的线性表(输入受限的双端队列、输出受限的双端队列);
三、栈在表达式求值中的应用
(1)三种表达式的区别(用a、b和c来举例:a与b相加,与c相减)
- 前缀表达式(波兰式):-+abc
- 中缀表达式:a+b-c
- 后缀表达式(逆波兰式):ab+c-
四、栈在递归中的应用
(1)函数调用的特点:最后被调用的函数最先执行结束
(2)函数调用时,需要用一个栈存储:
- 调用返回地址
- 实参
- 局部变量
(3)递归算法求阶乘
#include<stdio.h>
int jc(int n);
int jc(int n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else if (n >= 2)
{
return n * jc(n - 1);
}
}
int main()
{
int n;
printf("请输出想要阶乘的数字:");
scanf_s("%d",&n);
printf("%d的阶乘结果:%d",n,jc(n));
return 0;
}
(4)递归算法求斐波拉契数列
#include<stdio.h>
int fib(int n);
int fib(int n)
{
if (n == 0)
{
return 0;//第一项等于0
}
else if(n==1)
{
return 1;//第二项等于1
}
else if(n>=2)
{
return fib(n) + fib(n - 1);//从第3项开始,每一项都等于前两项之和。
}
}
int main()
{
int n;
printf("请输入项数:\n");
scanf_s("%d",&n);//输入
printf("第%d项:%d",n,fib(n));//输出
return 0;
}
五、特殊矩阵的压缩存储(主要是计算、搞清楚里面对应关系)
(1)对称矩阵(n*n):
- 策略:只存储主对角线+下三角区(或者是主对角线+上三角区);