设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。

本文介绍如何设计一个程序,通过算符优先关系来求解算术四则混合运算表达式。实验目标包括掌握栈的实现和应用,实现对输入表达式的求值。算法基于两个栈,一个存储运算符,一个存储操作数和中间结果。通过比较运算符优先级,当遇到高优先级运算符时进行计算,最后得到表达式的值。
摘要由CSDN通过智能技术生成

一、实验目的
1.掌握栈的存储表示和实现
2.掌握栈的基本操作实现。
3.掌握栈在解决实际问题中的应用。
二、实验要求
问题描述:设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。
(1)输入的形式:表达式,例如2*(3+4)#
包含的运算符只能有’+’ 、’-’ 、’’ 、’/’ 、’(’、 ‘)’,“#”代表输入结束符;
(2)输出的形式:运算结果,例如2
(3+4)=14;
(3)程序所能达到的功能:对表达式求值并输出。
三、解题参考思路
为了实现用栈计算算数表达式的值,需设置两个工作栈:用于存储运算符的栈opter,以及用于存储操作数及中间结果的栈opnd。
算法基本思想如下:
(1)首先将操作数栈opnd设为空栈,而将’#‘作为运算符栈opter的栈底元素,这样的目的是判断表达式是否求值完毕。
(2)依次读入表达式的每个字,表达式须以’#‘结,读入字符若是操作数则入栈opnd,读入字符若是运算符,则将此运算符c与opter的栈顶元素top比较优先级后执行相应的操作,具体操作如下:
(i)若top的优先级小于c,即top<c,则将c直接入栈opter,并读入下一字符赋值给c;
(ii)若top的优先级等于c,即top=c,则弹出opter的栈顶元素,并读入下一字符赋值给c,这一步目的是进行括号操作;
(iii)若top优先级高于c,即top>c,则表明可以计算,此时弹出opnd的栈顶两个元素,并且弹出opter栈顶的的运算符,计算后将结果放入栈opnd中。直至opter的栈顶元素和当前读入的字符均为’#’,此时求值结束。
算符间的优先关系如下表所示(表来源:严蔚敏《数据结构》):

表中需要注意的是θ1为opter的栈顶元素,θ2为从表达式中读取的操作符,此优先级表可以用二维数组实现。

1.int getIndex(char theta)   //获取theta所对应的索引  
2.{
     
3.    int index = 0;  
4.    switch (theta)  
5.    {
     
6.    case '+':
7.        index = 0;  
8.        break;  
9.    case '-':  
10.        index = 1;  
11.        break;  
12.    case '*':  
13.        index = 2;  
14.        break;  
15.    case '/':  
16.        index = 3;  
17.        break;  
18.    case '(':  
19.        index = 4;  
20.        break;  
21.    case ')':  
22.        index = 5;  
23.        break;  
24.    case '#':  
25.        index = 6;  
26.    default:break;  
27.    }  
28.    return index;  
29.}  
30.  
31.char getPriority(char theta1, char theta2)   //获取theta1与theta2之间的优先级  
32.{
     
33.    const char priority[][7] =     //算符间的优先级关系  
34.    {
     
35.        {
    '>','>','<','<','<','>','>' },  
36.        {
    '>','>','<','<','<','>','>' },  
37.        {
    '>','>','>','>','<','>','>' },  
38.        {
    '>','>','>','>','<','>','>' },  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值