队列
栈和队列的应用
栈在括号匹配中的应用
栈在表达式求值中的应用
表达式求值是程序设计语言编译中一个最基本的问题,它的实现是栈应用的一个典型范例。中缀表达式不仅依赖运算符的优先级,而且还要处理括号。后缀表达式的运算符在操作数后面,在后缀表达式中已考虑了运算符的优先级,没有括号,只有操作数和运算符。中缀表达式A+B*(C-D)-E/F所对应的后缀表达式为ABCD-*+EF/-。
通过后缀表示计算表达式值的过程为:顺序扫描表达式的每一项,然后根据它的类型做如下相应操作:若该项是操作数,则将其压入栈中;若该项是操作符< op >,则连续从栈中退出两个操作数Y和x,形成运算指令图对应的表达式X< op >Y,并将计算结果重新压入栈中。当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。
栈在递归中的应用
递归是一种重要的程序设计方法。简单地说,若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。
它通常把一个大型的复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的代码就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。
但在通常情况下,它的效率并不是太高。
常见的是:斐波那契数列
int Fib(int n){/斐波那契数列的实现if(n==0)
return 0;/边界条件
else if(n==1)
return 1;/边界条件
else return Fib(n-1)+Fib(n-2);//递归表达式
应用题
某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于货车上船,且每上4辆客车,才允许放上1辆货车;若等待客车不足4辆,则以货车代替;若无货车等待,允许客车都上船。试设计一个算法模拟渡口管理。
- 算法思想
假设数组q的最大下标为10,恰好是每次载渡的最大量。假设客车的队列为q1,货车的队列为q2。若q1充足,则每取4个q1元素后再取一个q2元素,直到q的长度为10。
若q1不充足,则直接用q2补齐。 - 算法的实现如下:
Queue q;//过江渡船载渡队列
Queue q1;/客车队列
Queue q2;/货车队列
void manager(){
int i=0,j=0;//j表示渡船上的总车辆数
while(j<10){//不足10辆时
if(!QueueEmpty(q1)&&i<4{//客车队列不空,则未上足4辆
DeQueue(q1,x);/从客车队列出队
EnQueue(q,x);//客车上渡船
i++;//客车总数加1
j++;//渡船上的总车辆数加1,
}
else if(i==4&&!QueueEmpty(q2){//客车已上足4辆
DeQueue(q2,x);//从货车队列出队
EnQueue(q,x);//货车上渡船
j++;//渡船上总车辆数加1.
i=0;/每上一辆货车,i重新计数
}
else(//其他情况(客车队列空或货车队列空)
while(j<10&&i<4&&!QueueEmpty(q2){//客车队列空
DeQueue(q2,x);//从货车队列出队
EnQueue(q,×);//货车上渡船
i++;//i计数,当i>4时,退出本循环
j++;//渡船上的总车辆数加1
}
i=0;
}
if(QueueEmpty(q1)&&QueueEmpty(q2))
j=11;//若货车和客车加起来不足10辆
}
}