{k=n%r ;push(S,k);n/=r;}
while(!StackEmpty(S))
{pop(S,k);printf(“%d ”,k);}
}
例3.3 表达式中括号匹配问题。假设一个算术表达 式中包含圆括号、方括号和花括号三种类型的括号 ,编写一个判别表达式中括号是否正确配对的算法
。
算法思想:算术表达式中三种括号出现的次序 正好符合后到的括号要最先被匹配的“后进先 出”的栈的操作特点,因此可以利用一个栈来 存储三种左括号。当右括号出现时,看当前栈 顶括号是否与之匹配,若匹配则退栈,若不匹 配说明算术表达式中括号配对不正确。若算术 表达式中所有括号都能正确的别消解,则改算 术表达式中括号配对正确,否则该算术表达式 中括号配对不正确。用顺序栈实现如下 :
if((Sq->rear+1)%MAXSIZE==Sq->front) return 0; /*若循环队 列已满*/ Sq->elem[Sq->rear]=x; /*若循环队列未满,则先插入元素, 后将尾指针后移*/ Sq->rear=(Sq->rear+1)%MAXSIZE; return 1; }
数据结构
主编 许绘香 段明义 中国水利水电出版社
第三章 栈和队列
栈和队列是两种特殊的线性结构。从数据的结 构角度看,它们是线性表,从操作的角度看, 它们是操作受限的线性表。在日常生活中经常 会遇到栈或队列的实例。例如,停车场车辆的 调度要用到栈,排队购物要用到队列。
3.1工作场景导入
【工作场景】 某公司有一个地下停车场如图3-1-1,此停车场是一个可停 放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车 场内按照车辆到达时间的先后顺序, 依次从停车场最里向大门口 处停放(最先到达的第一辆车放在停车场的最里面)。 若车场内已 停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开 走,则排在便道上的第一辆车即可开入;当停车场内的某辆车要开 走时,在它之后进入的车辆必须退出车场为它让路,待该辆车开出 大门外,其他车辆再按照原次序进入车场,每辆车停放在车场的车 在它离开停车场时必须按照它停留的时间长短交纳费用. 如果停 留在便道上的车未进停车场就要离去,允许其离去,不收停车费, 并且仍然保持在便道上等待的车辆次序。编制程序模拟该停车场