输入一串整数算式(包含加、减、乘、除四则运算和括号运算),以#结尾,计算并输出算式结果。

输入样例:

(10/2/5+1)*2#

输出样例:

4

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//节点结构体
typedef struct node {int data;//储存数据struct node *next;//指向下一个节点
}Node;//栈结构体
typedef struct stack {int count;//位数Node *top;//指向top节点
}Stack;//创建栈结构体
Stack *_createStack();
//创建节点结构体
Node *_createNode();
//出栈
int _pop(Stack **s);
//进栈
void _push(Stack **s,int a);
//判空
int _emptyStack(Stack *S);
//获取非空栈顶元素
int _getTop(Stack *S);
//优先级判断
int _priority(char ch);
//运算
void _operation(Stack *s1, Stack *s2);
//销毁
void _destroy(Stack *S);int main()
{//创建两个栈,一个用于数字,一个用于操作符Stack *S1, *S2;S1 = _createStack();S2 = _createStack();//输入计算式char str[100] = {0};scanf("%s", str);int i;int iCarry = 0;//进位i = 0;//计算:当计算式未读取完或着操作符还在被压栈进行while循环while(str[i] != '#' || _emptyStack(S2) == 0) {//数字if(str[i] >= '0' && str[i] <= '9') {iCarry = iCarry * 10 + str[i] - '0';i++;if(str[i] < '0' || str[i] > '9') {//数字一直相加直到下一个为操作符_push(&S1,iCarry);iCarry = 0;}}else {//进栈不运算:空栈、栈顶为'('且该操作符不为')'、该操作符优先级高于栈顶if((_emptyStack(S2) == 1) || (_getTop(S2) == '(' && str[i] != ')') || (_priority(str[i]) > _priority(_getTop(S2)))){_push(&S2,str[i]);i++;continue;}//出栈不运算:运算结束()里的内容,将'('出栈if(_getTop(S2) == '(' && str[i] == ')') {_pop(&S2);i++;continue;}//出栈运算:栈不为空,')'前有其他操作符、该操作符优先级小于等于压栈的栈顶操作符if((_emptyStack(S2) == 0) || (str[i] == ')' && _getTop(S2) != '(') || _priority(str[i]) <= _priority(_getTop(S2))) {_operation(S1,S2);}continue;}}//打印结果printf("%d",_getTop(S1));//销毁_destroy(S1);_destroy(S2);return 0;
}
//_createStack
Stack *_createStack() {Stack *p;p = (Stack*)malloc(sizeof(Stack));p -> count = 0; //初始化栈p -> top = NULL;return p;
}
//_createNode
Node *_createNode() {Node *p;p = (Node*)malloc(sizeof(Node));return p;
}
//_emptyStack
int _emptyStack(Stack *S){return (S -> count == 0) ? 1 : 0;
}
//_getTop
int _getTop(Stack *S) {if(S == NULL)return 0;elsereturn (S -> top -> data);
}
//_priority
int _priority(char ch) {switch(ch){case '(':              //前括号优先级3return 3;case '*':case '/':                //乘除2return 2;case '+':case '-':               //加减1return 1;default :return 0;}
}
//_pop
int _pop(Stack **s){if (NULL == (*s) -> top)return 0;int a;a = (*s) -> top -> data;(*s) -> top = (*s) -> top -> next;(*s) -> count--;
printf("pop%d\n",a);return a;
}
//_push
void _push(Stack **s,int a) {Node *p = (Node*)malloc(sizeof(Node));p -> data = a;p -> next = (*s) -> top;(*s) -> top = p;(*s) -> count++;
printf("push%d\n",a);
}
//_operation
void _operation(Stack *s1, Stack *s2){int tmp,t;switch(_pop(&s2)) {case '+':_push(&s1,_pop(&s1) + _pop(&s1));break;case '-':tmp= _pop(&s1);_push(&s1,_pop(&s1) - tmp);break;case '*':_push(&s1,_pop(&s1) * _pop(&s1));break;case '/':t = _pop(&s1);_push(&s1, _pop(&s1) / t);break;default :break;}
}
void _destroy(Stack *S) {Node *p;p = S -> top;while(p) {S -> top = S -> top -> next;free(p);p = S -> top;}
}

【C语言】运用栈解决四则运算相关推荐

  1. 用栈解决四则运算问题

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文章的 ...

  2. c语言利用栈实现四则运算(包括括号小数),DataStructure_1用栈实现四则运算(c语言)...

    有一句计算机界中的至理名言: 程序=数据结构+算法 可见数据结构是多么地重要啊......呵呵 今天开始复习了一下数据结构 , 解决了以前的一个问题: 用栈这个数据结构实现四则运算 算法思想是借鉴了& ...

  3. 应用栈解决迷宫问题的C语言实现

    应用栈解决迷宫问题的C语言实现 参考文章: (1)应用栈解决迷宫问题的C语言实现 (2)https://www.cnblogs.com/AlgrithmsRookie/p/5958040.html 备 ...

  4. C语言程序:用栈实现四则运算

    用栈实现四则运算 第一部分 :LinkStack.h #ifndef LINKSTACK_H #define LINKSTACK_H#include <stdlib.h> #include ...

  5. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  6. c语言构建栈_选择技术栈构建通用平台

    c语言构建栈 Java社区中有许多关于Spring vs Java EE的话题. 一群人会争辩说您应该使用一个而不是其他.等等.当我看到这一点时,我不禁要想为什么我们不能同时使用它们呢? 实际上,我认 ...

  7. Golang语言全栈开发视频教程全集

    基础课: 语言基础第01天(变量和基本类型) 语言基础第02天(运算符和流程控制) 语言基础第03天(循环函数和工程管理) 语言基础第04天(工程管理和数组) 语言基础第05天(切片和map) 语言基 ...

  8. c语言特殊计算器设计报告,C语言数据结构栈计算器的实现课题设计报告书

    C语言数据结构栈计算器的实现课题设计报告书 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 目录1. 课程设计任务 12. 需求分析 ...

  9. C++的STL 栈 实现四则运算

    使用栈实现四则运算,支持+,-,*,/,(,) 输入为字符串,输出为计算好的数值,如不符合四则运算的规定,则异常退出 这个实现借用了栈以及字符处理状态机的思想: 维护两个栈:一个用于数值,另一个用于存 ...

最新文章

  1. 如何理解PacBio的准确度?
  2. 程序员必看 c++笔试题汇总
  3. 第14章WEB14-JDBC案例篇
  4. python脚本语言是什么意思_python为什么是脚本语言
  5. js倒计时,距离某个时间的倒计时。
  6. c语言中整形数据分为几进制,c语言中整型数据中的8进制以及16进制数据 – 手机爱问...
  7. Dapper在.Net中的使用(二)
  8. 除了随机还要进化——对Infinity进一步的想法
  9. C# 值类型和引用类型 以及作为方法参数的区别
  10. win7下计算机假死,Win7系统电脑经常发生假死现象的五种情况及解决方法
  11. 基于腾讯云播放器封装的Flutter Video Player插件
  12. 美国人眼中的大数据法律问题
  13. OTA升级功能系列三(MD5加密)
  14. 勒索软件攻击为何越来越多?
  15. 任意转换横竖屏,巧用画面裁切功能批量剪辑视频
  16. 查询身份证号归属地,查询ip所有地
  17. 第一章计算机网络概述
  18. 成功不是偶然的,它是从寂寞中成长起来的花朵-----王选
  19. ISE更改内置的编辑器
  20. Unity 计算图片真实存储大小(Preview视图)

热门文章

  1. IDEA快捷键设置,选择Eclipse风格的快捷键,自动补全快捷键,关闭当前窗口快捷键Ctrl+W,自动导入设置,引入外部的jar的方式,设置项目字体,设置项目字符集,Maven的方式获取jar
  2. android开发(25) - 推送的实现,使用百度云推送
  3. HTTP协议小讲解,超细
  4. 线性代数 --- 向量的内积(点积)(个人学习笔记)
  5. 采用Java方式实现数据同步
  6. 时间:UTC时间、GMT时间、本地时间、Unix时间戳
  7. Linux进程和任务管理和分析和排查系统故障
  8. 集成电路领域核心会议与期刊
  9. vue环境简单实现动态瀑布流效果
  10. 酷玩部落:智能硬件的游戏化