C语言简易计算器(中缀表达式转后缀表达式,通过堆栈实现)
来源:互联网 发布:互联网大数据公司 编辑:程序博客网 时间:2024/05/29 13:41
用C语言,写了一个简易的计算器,只有加减乘除,没有括号,但是若果要实现括号也是很容易的。
其核心思想是将输入的中缀表达式转换为后缀表达式,转换的思想主要参考了这位大牛的博客:http://blog.csdn.net/ssjhust123/article/details/8001651。
例如:输入中缀表达式2+2*3/2-1,程序可将其转换成后缀表达式2,2,3,2,/,*,+,1,- 其中','是为了间隔开数字,便于提取。最终的输出结果为:4
第一次发帖,本人菜鸟,欢迎高手批评指正!
代码如下:
#include "stdio.h"#include "string.h"#include "malloc.h"typedef struct tag_STACK_STRU{float valueData;struct tag_STACK_STRU *pNext;}stackList;//用链表实现数据的存储stackList *g_stOperand = NULL;//操作数stackList *g_stOperator = NULL; //操作符void makeEmpty(stackList *stack);//清空栈char isEmpty(stackList *stack);//判断栈是否为空void push(stackList *stack, float data);//入栈操作void pop(stackList *stack);//出栈操作void calculate(char *p);//计算的子程序void changeStr(char *p);//将中缀表达式转换为后缀表达式char suffixStr[1024];int main(){// 业务代码实现处char *p = (char *)malloc(sizeof(char));g_stOperand = (stackList *)malloc(sizeof(stackList));g_stOperand->pNext = NULL;makeEmpty(g_stOperand);g_stOperator = (stackList *)malloc(sizeof(stackList));g_stOperator->pNext = NULL;makeEmpty(g_stOperator);scanf("%s",p);//获取输入的中缀表达式changeStr(p);//将中缀表达式转换成后缀表达式calculate(suffixStr);//通过后缀表达式进行计算printf("%d", (int)g_stOperand->pNext->valueData);//打印出最后结果//while(1);return 0;}//清空栈的操作void makeEmpty(stackList *stack){if (stack == NULL)printf("must creat stack first");while(!isEmpty(stack))pop(stack);}//判断栈是否为空char isEmpty(stackList *stack){return (stack->pNext == NULL);}//入栈操作void push(stackList *stack, float data){stackList *pTemp = (stackList *)malloc(sizeof(stackList));if (stack == g_stOperand)//操作数入栈{if (pTemp == NULL)return;pTemp->valueData = data;pTemp->pNext = stack->pNext;stack->pNext = pTemp;}if (stack == g_stOperator)//操作符入栈{if (pTemp == NULL)return;pTemp->valueData = data;pTemp->pNext = stack->pNext;stack->pNext = pTemp;}}//出栈操作void pop(stackList *stack){stackList *pTop = NULL;if (isEmpty(stack))return;pTop = stack->pNext;stack->pNext = stack->pNext->pNext;free(pTop);}//计算void calculate(char *p){float a, b, t;char temp[100];int i = 0;makeEmpty(g_stOperand);makeEmpty(g_stOperator);while(*p){if((*p >= '0') && (*p <= '9')){while((*p >= '0') && (*p <= '9')){temp[i] = *p;p++;i++;}push(g_stOperand, atoi(temp));memset(temp, 0, sizeof(temp));i = 0;}if (*p == '+'){a = g_stOperand->pNext->valueData;pop(g_stOperand);b = g_stOperand->pNext->valueData;pop(g_stOperand);t = b + a; push(g_stOperand, t);}if (*p == '-'){a = g_stOperand->pNext->valueData;pop(g_stOperand);b = g_stOperand->pNext->valueData;pop(g_stOperand);t = b - a;push(g_stOperand, t);}if (*p == '*'){a = g_stOperand->pNext->valueData;pop(g_stOperand);b = g_stOperand->pNext->valueData;pop(g_stOperand);t = b * a;push(g_stOperand, t);}if (*p == '/'){a = g_stOperand->pNext->valueData;pop(g_stOperand);b = g_stOperand->pNext->valueData;pop(g_stOperand);t = b / a;push(g_stOperand, t);}p++;}}void changeStr(char *p){stackList *k = (stackList *)malloc(sizeof(stackList));int i = 0;k = g_stOperator;while(*p){if((*p >= '0') && (*p <= '9')){while((*p >= '0') && (*p <= '9')){suffixStr[i] = *p;p++;i++;}suffixStr[i++] = ',';}/* '+' ------- 1'-' ------- 2'*' ------- 5'/' ------- 6*/if (*p == '+'){if ( ( isEmpty(g_stOperator) ) )push(g_stOperator, 1);else if ( (g_stOperator->pNext->valueData - 1) > 2 ){while ( !isEmpty(g_stOperator) ){switch ((int)g_stOperator->pNext->valueData){case 1: suffixStr[i++] = '+'; suffixStr[i++] = ','; break;case 2: suffixStr[i++] = '-'; suffixStr[i++] = ','; break;case 5: suffixStr[i++] = '*'; suffixStr[i++] = ','; break;case 6: suffixStr[i++] = '/'; suffixStr[i++] = ','; break;}pop(g_stOperator);}push(g_stOperator, 1);}elsepush(g_stOperator, 1);p++;}if (*p == '-'){if ( ( isEmpty(g_stOperator) ) )push(g_stOperator, 2);else if ( (g_stOperator->pNext->valueData - 1) > 2 ){while ( !isEmpty(g_stOperator) ){switch ((int)g_stOperator->pNext->valueData){case 1: suffixStr[i++] = '+'; suffixStr[i++] = ','; break;case 2: suffixStr[i++] = '-'; suffixStr[i++] = ','; break;case 5: suffixStr[i++] = '*'; suffixStr[i++] = ','; break;case 6: suffixStr[i++] = '/'; suffixStr[i++] = ','; break;}pop(g_stOperator);}push(g_stOperator, 2);}elsepush(g_stOperator, 2);p++;}if (*p == '*'){push(g_stOperator, 5);p++;}if (*p == '/'){push(g_stOperator, 6);p++;}}while ( !isEmpty(g_stOperator) ){switch ((int)g_stOperator->pNext->valueData){case 1: suffixStr[i++] = '+'; suffixStr[i++] = ','; break;case 2: suffixStr[i++] = '-'; suffixStr[i++] = ','; break;case 5: suffixStr[i++] = '*'; suffixStr[i++] = ','; break;case 6: suffixStr[i++] = '/'; suffixStr[i++] = ','; break;}pop(g_stOperator);}}
- C语言简易计算器(中缀表达式转后缀表达式,通过堆栈实现)
- 计算器实现---中缀表达式转后缀表达式
- C语言 实现中缀表达式转后缀表达式并求值
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- 链式堆栈---实现中缀表达式转后缀表达式
- 中缀表达式转后缀表达式附带求和(C语言实现)
- 计算器:中缀表达式转后缀表达式
- c++ 中缀表达式转后缀表达式 计算器
- 使用c语言实现后缀表达式计算器
- 中缀表达式转成后缀表达式 C实现
- C语言实现括号匹配,中缀表达式转后缀表达式并计算具体代码实现
- 数据结构堆栈之中缀表达式转后缀
- C用栈实现中缀表达式转后缀表达式
- C语言实现括号匹配,中缀表达式转后缀表达式并计算的算法
- 栈的应用:中缀表达式转为后缀表达式(c语言实现)
- 中缀转后缀表达式(栈实现)
- 中缀表达式转换为后缀表达式--堆栈实现
- 堆栈实现中缀表达式转后缀表达式及计算表达式的值
- Command-Line Arguments
- .NET程序是如何编译的
- 机器学习之开源库大总结
- js改变img标签的src属性在IE下出问题的解决方法
- js和jsp得到网页传值的方法
- C语言简易计算器(中缀表达式转后缀表达式,通过堆栈实现)
- 批量文件操作-批处理删除文件夹
- 嵌入式Linux学习(一)
- C# EventHandler and Delegate(委托的使用)
- HDU 2066
- 2013/07/23 SQLLDR POSITION
- hdu2896之AC自动机
- VC++, CString的各个函数用法详解与小示例
- Linux查看CPU和内存使用情况