ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

栈应用_计算按运算符优先级分布的算式(代码、分析、汇编)

2020-12-30 10:29:06  阅读:277  来源: 互联网

标签:LinkStack right 优先级 算式 ret 运算符 int exp stack


目录:

代码:

LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
栈-线性表

main.c

#include <stdio.h>
#include "LinkStack.h"

//该程序用栈来计算算式 
/*
 比如:1*5+6/(5-3)  可以转换成 15*653-/+ 字符串进行运算
 注意:每个数只能是一位数
 */
 


int isNumber(char c)//检测是否是数字
{
    return ('0' <= c) && (c <= '9');
}

int isOperator(char c)//检测是否是加减乘除符号
{
    return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}

int value(char c)//字符返回数值
{
    return (c - '0');
}

int express(int left, int right, char op)//计算两个值加减乘除
{
    int ret = 0;
    
    switch(op)
    {
        case '+':
            ret = left + right;
            break;
        case '-':
            ret = left - right;
            break;
        case '*':
            ret = left * right;
            break;
        case '/':
            ret = left / right;
            break;
        default:
            break;
    }
    
    return ret;
}

int compute(const char* exp)//将字符串的算式计算结果
{
    LinkStack* stack = LinkStack_Create();//创建栈
    int ret = 0;
    int i = 0;
    
    while( exp[i] != '\0' )//将每个字符取出
    {
        if( isNumber(exp[i]) )//如果是数字
        {
			
            LinkStack_Push(stack, (void*)value(exp[i]));//将数值转成地址进栈 9转成000009
        }
        else if( isOperator(exp[i]) )//如果是运算符号
        {
            int right = (int)LinkStack_Pop(stack);
            int left = (int)LinkStack_Pop(stack);
            int result = express(left, right, exp[i]);//取出两个数值运算
            
            LinkStack_Push(stack, (void*)result);//再将结果进栈
        }
        else
        {
            printf("Invalid expression!");
            break;
        }
        
        i++;
    }
    
    if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )//如果栈内只有一个元素就是最后的运算后进栈的结果
    {
        ret = (int)LinkStack_Pop(stack);//出栈获取算式结果
    } 
    else 
    {
        printf("Invalid expression!");
    }
    
    LinkStack_Destroy(stack);//销毁栈
    
    return ret;
}

int main()
{
    printf("9 + (3 - 1) * 5 + 8 / 2 = %d\n", compute("931-5*+82/+"));
    
	
	getchar();
    return 0;
}

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:LinkStack,right,优先级,算式,ret,运算符,int,exp,stack
来源: https://blog.csdn.net/m0_37599645/article/details/111944287

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有