《数据结构》算术表达式求值Word文档格式.docx
- 文档编号:1560913
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:28
- 大小:50.15KB
《数据结构》算术表达式求值Word文档格式.docx
《《数据结构》算术表达式求值Word文档格式.docx》由会员分享,可在线阅读,更多相关《《数据结构》算术表达式求值Word文档格式.docx(28页珍藏版)》请在冰点文库上搜索。
运算符取栈顶元素
栈为空的时候返回
运算符栈为空
栈不为空的时候用做返回值,返回的栈顶元素,并返回
运算符入栈
运算符栈满
栈满的时候,追加个存储空间
把入栈
运算符出栈
栈为空栈的时候,返回
栈不为空的时候用做返回值,删除的栈顶元素,并返回
运算符栈的遍历
运算符栈为空栈为空栈的时候返回
栈不为空的时候依次取出栈内元素
(2)数字栈部分:
定义数栈
栈底指针
建立一个空栈
存储分配失败
数栈取栈顶元素
运算数栈为空栈为空的时候返回
栈不为空的时候,用作返回值,返回的栈顶元素,并返回
数栈入栈
运算数栈满栈满的时候,追加个存储空间
插入元素为新的栈顶元素
栈顶指针变化
数栈出栈
运算符栈为空栈为空栈的视时候,返回
栈不空的时候,则删除的栈顶元素,用返回其值,并返回
数栈遍历
运算数栈为空栈为空栈的时候返回
栈不为空的时候依次输出
、算法:
建立两个不同类型的空栈,先把一个压入运算符栈。
输入一个算术表达式的字符串(以结束),从第一个字符依次向后读,把读取的数字放入数字栈,运算符放入运算符栈。
判断新读取的运算符和运算符栈顶得运算符号的优先级,以便确定是运算还是把运算符压入运算符栈。
最后两个遇到一起则运算结束。
数字栈顶的数字就是要求的结果。
、时间复杂度:
数据压缩存储栈,其操作主要有:
建立栈
入栈
出栈。
以上各操作运算的平均时间复杂度为,其主要时间是耗费在输入操作。
如图所示。
最终结果如图所示:
七、源代码
/✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉
第七题算术表达式求值
☯问题描述]
一个算术表达式是由操作数☎☐☐♏❒♋⏹♎✆、运算符☎☐☐♏❒♋♦☐❒✆和界限符☎♎♏●♓❍♓♦♏❒✆组成的。
假设操作数是正整数,
运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符❽✁❾,
如:
✁(7+15)✉(23-28/4)✁。
编程利用❽算符优先法❾求算术表达式的值。
☯基本要求]
(1)从键盘读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉/
✁♓⏹♍●◆♎♏<
♦♦♎♓☐.♒>
♦♦❒♓⏹♑.♒>
♦♦♎●♓♌.♒>
❍♋♦♒.♒>
♍☐⏹♓☐.♒>
♍♦⍓☐♏.♒>
✁♎♏♐♓⏹♏OK1
✁♎♏♐♓⏹♏☜RROR0
✁♎♏♐♓⏹♏S❆✌CK♉✋☠✋❆♉S✋☪☜100
//✁♎♏♐♓⏹♏S❆✌CK✋☠CR☜M☜☠❆10
//========================================================
//以下定义两种栈,分别存放运算符和数字
//✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉运算符栈部分✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉
♦♦❒◆♍♦S❑S♦♋♍k//定义栈
{
♍♒♋❒✉♌♋♦♏;
//栈底指针
♍♒♋❒✉♦☐☐;
//栈顶指针
♓⏹♦♦♦♋♍k♦♓z♏;
//栈的长度
❝;
♓⏹♦✋⏹♓♦S♦♋♍k☎S❑S♦♋♍k&
♦✆//建立一个空栈S
♓♐☎✐☎♦.♌♋♦♏=☎♍♒♋❒✉✆❍♋●●☐♍☎50✉♦♓z♏☐♐☎♍♒♋❒✆✆✆✆
♏⌧♓♦☎0✆;
♦.♦☐☐=♦.♌♋♦♏;
♦.♦♦♋♍k♦♓z♏=50;
❒♏♦◆❒⏹OK;
❝
♍♒♋❒☝♏♦❆☐☐☎S❑S♦♋♍k♦,♍♒♋❒&
♏✆//运算符取栈顶元素
♓♐☎♦.♦☐☐==♦.♌♋♦♏✆//栈为空的时候返回☜RROR
{
☐❒♓⏹♦♐☎✂运算符栈为空✐\⏹✂✆;
❒♏♦◆❒⏹☜RROR;
❝
♏●♦♏
♏=✉☎♦.♦☐☐-1✆;
//栈不为空的时候用♏做返回值,返回S的栈顶元素,并返回OK
❒♏♦◆❒⏹OK;
❝
♓⏹♦P◆♦♒☎S❑S♦♋♍k&
♦,♍♒♋❒♏✆//运算符入栈
♓♐☎♦.♦☐☐-♦.♌♋♦♏>
=♦.♦♦♋♍k♦♓z♏✆
{
☐❒♓⏹♦♐☎✂运算符栈满✐\⏹✂✆;
♦.♌♋♦♏=☎♍♒♋❒✉✆❒♏♋●●☐♍☎♦.♌♋♦♏,☎♦.♦♦♋♍k♦♓z♏+5✆✉♦♓z♏☐♐☎♍♒♋❒✆✆;
//栈满的时候,追加5个存储空间
♓♐☎✐♦.♌♋♦♏✆♏⌧♓♦☎O✞☜R☞☹OW✆;
♦.♦☐☐=♦.♌♋♦♏+♦.♦♦♋♍k♦♓z♏;
♦.♦♦♋♍k♦♓z♏+=5;
❝
✉☎♦.♦☐☐✆++=♏;
//把♏入栈
❒♏♦◆❒⏹OK;
❝
♓⏹♦P☐☐☎S❑S♦♋♍k&
♦,♍♒♋❒&
♏✆//运算符出栈
♓♐☎♦.♦☐☐==♦.♌♋♦♏✆//栈为空栈的时候,返回☜RROR
♏●♦♏
♏=✉--♦.♦☐☐;
//栈不为空的时候用♏做返回值,删除S的栈顶元素,并返回OK
❒♏♦◆❒⏹OK;
♓⏹♦S♦♋♍k❆❒♋v♏❒♦♏☎S❑S♦♋♍k&
♦✆//运算符栈的遍历
{
♍♒♋❒✉♦;
♦=♦.♌♋♦♏;
♓♐☎♦.♦☐☐==♦.♌♋♦♏✆
//栈为空栈的时候返回☜RROR
♦♒♓●♏☎♦✐=♦.♦☐☐✆
☐❒♓⏹♦♐☎✂%♍✂,✉♦✆;
//栈不为空的时候依次取出栈内元素
♦++;
❒♏♦◆❒⏹☜RROR;
❝
//✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉数字栈部分✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉✉
♦♦❒◆♍♦S❑S♦♋♍k⏹//定义数栈
♓⏹♦✉♌♋♦♏;
♓⏹♦✉♦☐☐;
//栈顶指针
♓⏹♦✋⏹♓♦S♦♋♍k⏹☎S❑S♦♋♍k⏹&
♦✆//建立一个空栈S
♦.♌♋♦♏=☎♓⏹♦✉✆❍♋●●☐♍☎50✉♦♓z♏☐♐☎♓⏹♦✆✆;
♓♐☎✐♦.♌♋♦♏✆♏⌧♓♦☎O✞☜R☞☹OW✆;
//存储分配失败
♓⏹♦☝♏♦❆☐☐⏹☎S❑S♦♋♍k⏹♦,♓⏹♦&
♏✆//数栈取栈顶元素
{
♓♐☎♦.♦☐☐==♦.♌♋♦♏✆
☐❒♓⏹♦♐☎✂运算数栈为空✐\⏹✂✆;
//栈为空的时候返回☜RROR
//栈不为空的时候,用♏作返回值,返回S的栈顶元素,并返回OK
♓⏹♦P◆♦♒⏹☎S❑S♦♋♍k⏹&
♦,♓⏹♦♏✆//数栈入栈
=♦.♦♦♋♍k♦♓z♏✆
☐❒♓⏹♦♐☎✂运算数栈满✐\⏹✂✆;
//栈满的时候,追加5个存储空间
♦.♌♋♦♏=☎♓⏹♦✉✆❒♏♋●●☐♍☎♦.♌♋♦♏,☎♦.♦♦♋♍k♦♓z♏+5✆✉♦♓z♏☐♐☎♓⏹♦✆✆;
//插入元素♏为新的栈顶元素
//栈顶指针变化
♓⏹♦P☐☐⏹☎S❑S♦♋♍k⏹&
♦,♓⏹♦&
♏✆//数栈出栈
☐❒♓⏹♦♐☎✂运算符栈为空✐\⏹✂✆;
//栈为空栈的视时候,返回☜RROR
//栈不空的时候,则删除S的栈顶元素,用♏返回其值,并返回OK
♓⏹♦S♦♋♍k❆❒♋v♏❒♦♏⏹☎S❑S♦♋♍k⏹&
♦✆//数栈遍历
♓⏹♦✉♦;
☐❒♓⏹♦♐☎✂运算数栈为空✐\⏹✂✆;
//栈为空栈的时候返回☜RROR
☐❒♓⏹♦♐☎✂%♎✂,✉♦✆;
//栈不为空的时候依次输出
//以下定义函数
♓⏹♦✋♦☐☐♏❒♋♦☐❒☎♍♒♋❒♍♒✆//判断是否为运算符,分别将运算符和数字进入不同的栈
♦♦♓♦♍♒☎♍♒✆
♍♋♦♏'
+'
:
-'
✉'
/'
☎'
✆'
✁'
❒♏♦◆❒⏹1;
♎♏♐♋◆●♦:
❒♏♦◆❒⏹0;
♓⏹♦O☐♏❒♋♦♏☎♓⏹♦♋,♍♒♋❒☐☐,♓⏹♦♌✆//运算操作
♓⏹♦❒♏♦◆●♦;
♦♦♓♦♍♒☎☐☐✆
❒♏♦◆●♦=♋+♌;
♌❒♏♋k;
❒♏♦◆●♦=♋-♌;
❒♏♦◆●♦=♋✉♌;
❒♏♦◆●♦=♋/♌;
❒♏♦◆❒⏹❒♏♦◆●♦;
♍♒♋❒P❒♏♍♏♎♏☎♍♒♋❒♍♒1,♍♒♋❒♍♒2✆//运算符优先级的比较
{
♍♒♋❒☐;
♦♦♓♦♍♒☎♍♒1✆
{
♍♋♦♏'
♓♐☎♍♒2=='
||♍♒2=='
✆
☐='
>
'
;
//♍♒1运算符的优先级小于♍♒2运算符
♏●♦♏
<
♌❒♏♋k;
♓♐☎♍♒2=='
☐='
='
♏●♦♏♓♐☎♍♒2=='
{
☐❒♓⏹♦♐☎✂表达式错误✐运算符不匹配✐\⏹✂✆;
♏⌧♓♦☎0✆;
❝
♏●♦♏
♌❒♏♋k;
♍♋♦♏'
☐='
{
☐❒♓⏹♦♐☎✂表达式错误✐运算符不匹配✐\⏹✂✆;
☐='
❝
❒♏♦◆❒⏹☐;
//以下是求值过程
♓⏹♦☜v♋●◆♋♦♏☜⌧☐❒♏♦♦♓☐⏹☎✆//参考书☐53算法3.4
{
♓⏹♦♋,♌,♦♏❍☐,♋⏹♦♦♏❒;
♍♒♋❒♍♒,☐☐,♏;
♍♒♋❒✉♦♦❒;
♓⏹♦j=0;
S❑S♦♋♍k⏹OP☠D;
//OP☠D为运算数字栈
S❑S♦♋♍kOP❆R;
//OP❆R为运算符栈
✋⏹♓♦S♦♋♍k☎OP❆R✆;
P◆♦♒☎OP❆R,'
✆;
//,所以此栈底是'
,因为运算符栈以'
作为结束标志
✋⏹♓♦S♦♋♍k⏹☎OP☠D✆;
//☐❒♓⏹♦♐☎✂\⏹\⏹按任意键开始求解:
\⏹\⏹✂✆;
//♍♒=♑♏♦♍♒☎✆;
☐❒♓⏹♦♐☎✂\⏹请输入表达式并以'
结束:
\⏹✂✆;
♦♦❒=☎♍♒♋❒✉✆❍♋●●☐♍☎50✉♦♓z♏☐♐☎♍♒♋❒✆✆;
♑♏♦♦☎♦♦❒✆;
♍♒=♦♦❒☯j];
//♍♒是字符型的,而♏是整型的整数
j++;
☝♏♦❆☐☐☎OP❆R,♏✆;
//♏为栈顶元素返回值
♦♒♓●♏☎♍♒✐='
||♏✐='
✆
♓♐☎✐✋♦☐☐♏❒♋♦☐❒☎♍♒✆✆//遇到数字,转换成十进制并计算
♦♏❍☐=♍♒-'
0'
//将字符转换为十进制数
♍♒=♦♦❒☯j];
j++;
♦♒♓●♏☎✐✋♦☐☐♏❒♋♦☐❒☎♍♒✆✆
{
♦♏❍☐=♦♏❍☐✉10+♍♒-'
//将逐个读入运算数的各位转化为十进制数
♍♒=♦♦❒☯j];
j++;
❝
P◆♦♒⏹☎OP☠D,♦♏❍☐✆;
♏●♦♏♓♐☎✋♦☐☐♏❒♋♦☐❒☎♍♒✆✆//判断是否是运算符,不是运算符则进栈
♦♦♓♦♍♒☎P❒♏♍♏♎♏☎♏,♍♒✆✆
{
♍♋♦♏'
:
P◆♦♒☎OP❆R,♍♒✆;
//栈顶元素优先权低
♍♒=♦♦❒☯j++];
☐❒♓⏹♦♐☎✂\⏹\⏹运算符栈为:
//输出栈,显示栈的变化
S♦♋♍k❆❒♋v♏❒♦♏☎OP❆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算术 表达式 求值