3.2栈的应用举例3.2.5-表达式求值ppt课件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



基本操作:
• InitQueue(&Q);
DestroyQueue (& Q);
• ClearQueue (& Q); QueueEmpty(Q);
• QueueLength(Q) ; GetHead(Q,&e);
• EnQueue (& Q,e); DeQueue (& Q,&e);
• QueueTraverse(Q ,visit ()) 8
OperandType EvaluateExpression()
{InitStack(OPTR); Push(OPTR, ‘#’);
InitStack(OPND); c = getchar();
While(c!=’#’ || GetTop(OPTR)!=’#’){ If(!In(c,OP)){ Push(OPND,c); c = getchar();} // 不是运算符则进栈
a
b
c
5
hanoi塔的递归算法
定义函数:movetower(n,a,c,b) n个盘a->c,b放临时盘
分三步:
movetower(n-1,a,b,c) 将n-1个盘从a->b, c放临时盘
movedisk(a,n,c)
将第n个盘从a->c
movetower(n-1,b,c,a) 将n-1个盘从b->c,a放临时盘

} // switch
} // while
return GetTop(OPND);
3
} // EvaluateExpression
对 算 术 表 达 式 3*(7-2) 求 值 .
步骤 1 2 3 4 5 6 7 8 9 10
OPTR栈 # # #* #*( #*( #*(#*(#*( #* #
队列(Queue): 先进先出(First In First Out)
• (缩写为FIFO)的线性表。 • 仅在队尾进行插入和队头进行删除操作的线性表。
队头(front): 线性表的表头端,即可删除端。
队尾(rear): 线性表的表尾端,即可插入端。
队头
对尾
a1 a2 a3 ...... an-1 an
OPND栈
3 3 3 37 37 372 35 35 15
输入字符
主要操作
wk.baidu.com
3 * ( 7 - 2 ) # Push(OPND,’3’)
* ( 7 - 2 ) # Push(OPTR,’*’)
( 7 - 2 ) # Push(OPTR,’(’)
7 - 2 ) # Push(OPND,’7’)
- 2 ) # Push(OPTR,’-’)
出队列(Dequeque)
入队列(Enqueue) 7
队列的抽象数据类型
ADT Queue {

数据对象: (i=1,2,…,n,
D= n≥0)}
{ai
|
ai 属 于 Elemset,

数据关系: D,(i=2,3,…,n)}
R约1 定=an为{ 队<尾ai-,1a,a1i为>队|a头i-1。,ai
else

switch(Precede(GetTop(OPTR),c)){

case ‘<’: // 栈顶元素优先权低

Push(OPTR,c); c = getchar();
break;

case ‘≒’: // 脱括号并接受下一个字符

Pop(OPTR,x); c = getchar();
break;
}ADT Queue
队列的基本操作(之一)
InitQueue (&Q)
• 操作结果:构造一个空的队列Q。
DestroyQueue (&Q)
• 初始条件: 队列Q已经存在。 • 操作结果: 销毁队列Q。
ClearQueue (&Q)
• 初始条件: 队列Q已经存在。 • 操作结果: 将队列Q重置为空队列。
-
*/
(
)
#
+
>><<<>>
-
>><<<>>
*
>>>><>>
/
>>>><>>
(
<<<<<≒
)
>>>>
>>
#
<
<<<<
=
Precede: 判定运算符栈的栈顶运算符θ 1与读入的运算符θ 2之间
的优先关系的函数.
2
Operate: 进行二元运算aθ b的函数.
算术表达式求值过程(算法3.4)
9
队列的基本操作(之二)
QueueEmpty(Q)
• 初始条件: 队列Q已经存在。 • 操作结果: 若队列Q为空队列,则返回TURE;
否则返回FALSE。
QueueLength(Q)
• 初始条件: 队列Q已经存在。 • 操作结果: 返回队列Q中的数据元素个数, 即
队列Q的长度。
GetHead(Q,&e)

case ‘>’: // 退栈并将运算结果入栈

Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);

Push(OPND,Operate(a,theta,b));
break;

default: printf(“Expression error!”); return(ERROR);
• 初始条件: 队列Q已经存在且非空。 • 操作结果: 用e返回队列Q中队头元素的值。10
队列的基本操作(之三)
3.2 栈的应用举例 3.2.5 表达式求值
算符优先法:
4+2*3-10/5 = 4+6-10/5 = 10-10/5 =10-2 = 8 操作数(operand): 进OPND栈 操作符(operator): 进OPTR栈 界限符(delimiter):
1
算符间的优先关系:
θ1 θ2 +
2 ) # Push(OPND,’2’)
) # Operate(‘7’,’-‘,’2’)
) # POP(OPTR)
# Operate(‘3’,’*’,’5’)
# Return(GetTop(OPND))
4
hanoi塔问题
例:汉诺塔问题: 将a柱子上的盘移到 c柱,用 b柱放临时盘 要求:一次只能移动一个盘,大盘不可放于小盘上。
void hanoi(int n, char a, char b, char c)
{if (n==1) move(a,1,c);
else{ hanoi(n-1,a,c,b);

move(a,n,c);

hanoi(n-1,b,a,c);
} 6
}
3.4 队列
3.4.1抽象数据类型队列的定义
相关文档
最新文档