哪些是队列的应用,哪些是栈的应用
栈在括号匹配中的应用
思路:
1.遍历字符数组
2.if为左括号,则入栈;
if为右括号,
1)空栈---返回false
2)出栈e,if不匹配返回false,if匹配则继续循环
3.循环结束,判断栈是否为空.if为空栈,返回true,if非空,返回false
主要代码
1.判断左括号则入栈
if (str[i]=='['|| str[i] == '(' || str[i] == '{')
push(s, str[i]);
2.如果右括号先判断是否为空栈
if (stackEmpty(s))
return false;
3.判断右括号,出栈,判断是否为完整的括号
char e;
pop(s, e);
if (e =='{'&& str[i]!='}')
{return false;}
if (e == '(' && str[i] != ')')
{ return false; }
if (e == '[' && str[i] != ']')
{ return false; }
4.attention:计算字符数组长度
int length = (sizeof(str) / sizeof(str[0]))-1;
因为字符数组会默认在尾部加入'/0',所以计算得到的长度会比实际长度多1位.
5.代码
bool bracketCheck(char str[] ,int length) {
//定义+初始化栈
sqStack s;
init(s);
for (int i = 0; i < length; i++)
{//判断为左括号还是右括号
//左括号--入栈
if (str[i]=='['|| str[i] == '(' || str[i] == '{')
{
push(s, str[i]);
}
else {
//右括号--出栈
//1.判断是否空栈--空false
if (stackEmpty(s))
{
return false;
}
char e;
//判断左括号右括号是否相符
pop(s, e);
if (e =='{'&& str[i]!='}')
{
return false;
}
if (e == '(' && str[i] != ')')
{
return false;
}
if (e == '[' && str[i] != ']')
{
return false;
}
}
}
return stackEmpty(s);
}
完整代码
#include<stdio.h>
#define MaxSize 10
//顺序栈定义
typedef struct sqStack {
char data[MaxSize];
int top;
}sqStack;
//初始化
void init(sqStack& s) {
s.top = -1;
}
//进栈
bool push(sqStack &s,char e) {//e输入数据
//判断是否栈满
if (s.top==MaxSize-1)
{
return false;
}
s.data[++s.top] = e;
return true;
}
//出栈
bool pop(sqStack& s, char &e) {
//判断是否空栈
if (s.top==-1)
{
return false;
}
e=s.data[s.top--];
return true;
}
//判断空栈
bool stackEmpty(sqStack s) {
if (s.top == -1)
{
return true;
}
return false;
}
//读取栈顶元素
bool getTop(sqStack &s,char &e) {
//判断是否空栈
if (s.top == -1)
{
return false;
}
e = s.data[s.top];
return true;
}
bool bracketCheck(char str[] ,int length) {
//定义+初始化栈
sqStack s;
init(s);
for (int i = 0; i < length; i++)
{//判断为左括号还是右括号
//左括号--入栈
if (str[i]=='['|| str[i] == '(' || str[i] == '{')
{
push(s, str[i]);
}
else {
//右括号--出栈
//1.判断是否空栈--空false
if (stackEmpty(s))
{
return false;
}
char e;
//判断左括号右括号是否相符
pop(s, e);
if (e =='{'&& str[i]!='}')
{
return false;
}
if (e == '(' && str[i] != ')')
{
return false;
}
if (e == '[' && str[i] != ']')
{
return false;
}
}
}
return stackEmpty(s);
}
int main() {
char str[] = "{{[]([])}}";
int length = (sizeof(str) / sizeof(str[0]))-1;//因为这里的长度还加入了'/0',所以会比书写的多一位
if (bracketCheck(str, length)) {
printf("配对成功!");
}
else {
printf("sorry,配对失败!");
}
}
栈在表达式中求值的应用
用栈实现中缀表达式转后缀表达式
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符
从左到右处理各个元素,直到末尾。可能遇到三种情况:
①遇到操作数。直接加入后缀表达式。
② 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(”不加入后缀表达式。③ 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
用栈实现后缀表达式的计算
①从左往右扫描下一个元素,直到处理完所有元素
②若扫描到操作数则压入栈,并回到;否则执行③
③若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①
用栈实现中缀表达式的计算
初始化两个栈,操作数栈和运算符栈
若扫描到操作数,压入操作数栈若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回探作数栈)
栈在递归中的应用
函数调用的特点:最后调用的,最先执行结束
递归的缺点:①递归层数太多导致栈溢出②可能包含多次重复运算
非递归算法通常比递归算法效率高一点,因为递归中有很多重复运算,所以算法效率低
队列在层次遍历中的应用
略
队列在计算机系统中的应用
略