【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
来源:互联网 发布:苹果5s网络显示e 编辑:程序博客网 时间:2024/04/29 21:18
先将中缀表达式转化成后缀表达式
再计算后缀表达式
计算后缀表达式的规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
代码 C++:VS2013 + WIN7
#include <iostream>using namespace std;#define ok 0#define error -1typedef int Elemtype;typedef int status;//函数返回的状态,如ok errortypedef struct StackNode{Elemtype data;struct StackNode *next;}StackNode, *StackNodeP;typedef struct LinkStack{StackNodeP top;int count;}LinkStack;LinkStack* LinkStack_Create();//链栈的创建status LinkStack_Clear(LinkStack* stack);//链栈的清空int LinkStack_Isempty(LinkStack* stack);//链栈是否为空status LinkStack_Push(LinkStack* stack, Elemtype e);//链栈的入栈Elemtype LinkStack_Pop(LinkStack* stack);//链栈的出栈int LinkStack_Length(LinkStack* stack);//链栈的长度Elemtype LinkStack_Top(LinkStack* stack);//链栈的头部元素status change(char* buf, char* afterbuf){int i = 0;LinkStack* LS = LinkStack_Create();/*设定( -1+ 1- 2* 3/ 4*/while (*buf){if ((*buf >= '0') && (*buf <= '9')){while ((*buf >= '0') && (*buf <= '9')){afterbuf[i] = *buf;buf++;i++;}afterbuf[i++] = ',';}if (*buf == '+'){if (LinkStack_Isempty(LS))//如果链栈为空,则直接将‘+’入栈LinkStack_Push(LS, 1);else if (LinkStack_Top(LS)> 2)//如果链栈的头结点上为‘*’‘/’,则栈中所有都弹出{while (!LinkStack_Isempty(LS))//直到将栈中的所有都弹出{if (LinkStack_Top(LS) == -1)//如果为'('则停止循环{break;}else{switch (LinkStack_Top(LS)){case 1:afterbuf[i++] = '+'; afterbuf[i++] = ','; break;case 2:afterbuf[i++] = '-'; afterbuf[i++] = ','; break;case 3:afterbuf[i++] = '*'; afterbuf[i++] = ','; break;case 4:afterbuf[i++] = '/'; afterbuf[i++] = ','; break;}}LinkStack_Pop(LS);}LinkStack_Push(LS, 1);}else//如果链栈中也是‘+’‘-’则直接入栈LinkStack_Push(LS, 1);buf++;}if (*buf == '-'){if (LinkStack_Isempty(LS))//如果链栈为空,则直接将‘+’入栈LinkStack_Push(LS, 2);else if (LinkStack_Top(LS)> 2)//如果链栈的头结点上为‘*’‘/’,则栈中所有都弹出{while (!LinkStack_Isempty(LS))//直到将栈中的所有都弹出{if (LinkStack_Top(LS) == -1)//如果为'('则停止循环{break;}else{switch (LinkStack_Top(LS)){case 1:afterbuf[i++] = '+'; afterbuf[i++] = ','; break;case 2:afterbuf[i++] = '-'; afterbuf[i++] = ','; break;case 3:afterbuf[i++] = '*'; afterbuf[i++] = ','; break;case 4:afterbuf[i++] = '/'; afterbuf[i++] = ','; break;}}LinkStack_Pop(LS);}LinkStack_Push(LS, 2);}else//如果链栈中也是‘+’‘-’则直接入栈LinkStack_Push(LS, 2);buf++;}if (*buf == '*')//如果为'*'直接入栈{LinkStack_Push(LS, 3);buf++;}if (*buf == '/')//如果为'/'直接入栈{LinkStack_Push(LS, 4);buf++;}if (*buf == '(')//如果为左括号则直接进栈{LinkStack_Push(LS, -1);buf++;}if (*buf == ')')//如果为右括号则出栈直到左括号{while (LinkStack_Top(LS) != -1){switch (LinkStack_Top(LS)){case 1:afterbuf[i++] = '+'; afterbuf[i++] = ','; break;case 2:afterbuf[i++] = '-'; afterbuf[i++] = ','; break;case 3:afterbuf[i++] = '*'; afterbuf[i++] = ','; break;case 4:afterbuf[i++] = '/'; afterbuf[i++] = ','; break;}LinkStack_Pop(LS);}LinkStack_Pop(LS);//最后把左括号给弹出来buf++;}}while (!LinkStack_Isempty(LS)){switch (LinkStack_Top(LS)){case 1:afterbuf[i++] = '+'; afterbuf[i++] = ','; break;case 2:afterbuf[i++] = '-'; afterbuf[i++] = ','; break;case 3:afterbuf[i++] = '*'; afterbuf[i++] = ','; break;case 4:afterbuf[i++] = '/'; afterbuf[i++] = ','; break;}LinkStack_Pop(LS);}return NULL;}int calculate(char* array){int result = 0;//用来保存计算结果int a, b;char buf[10] = { 0 };int i = 0;LinkStack* LS = LinkStack_Create();//创建一个栈while (*array){if ((*array >= '0') && (*array <= '9')){while ((*array >= '0') && (*array <= '9'))//检测多少位数{buf[i] = *array;i++;array++;}LinkStack_Push(LS, atoi(buf));//将数字入栈memset(buf, 0, sizeof(buf));i = 0;}if (*array == '+'){a = LinkStack_Pop(LS);//取出栈顶元素b = LinkStack_Pop(LS);//取出栈顶元素result = b + a;LinkStack_Push(LS, result);//再将计算结果入栈}if (*array == '-'){a = LinkStack_Pop(LS);b = LinkStack_Pop(LS);result = b - a;LinkStack_Push(LS, result);}if (*array == '*'){a = LinkStack_Pop(LS);b = LinkStack_Pop(LS);result = b * a;LinkStack_Push(LS, result);}if (*array == '/'){a = LinkStack_Pop(LS);b = LinkStack_Pop(LS);result = b / a;LinkStack_Push(LS, result);}array++;}return result;}int main(void){char* buf = (char*)malloc(sizeof(char));char afterbuf[1024] = { 0 };cin >> buf;change(buf, afterbuf);//中缀表达式转后缀表达式cout << "转换的后缀表达式为:" << afterbuf << endl;int result = calculate(afterbuf);//用后缀表达式来计算cout << "计算结果为:" << result << endl;system("pause");}//链栈的创建LinkStack* LinkStack_Create(){LinkStack* temp = NULL;temp = (LinkStack*)malloc(sizeof(LinkStack));if (temp == NULL)cout << "LinkStack_create 出错" << endl;temp->count = 0;temp->top = NULL;return temp;}//链栈的清空status LinkStack_Clear(LinkStack* stack){if (stack == NULL)return ok;stack->top->next = NULL;stack->count = 0;return ok;}//链栈是否为空int LinkStack_Isempty(LinkStack* stack){if (stack == NULL)return error;return stack->top == NULL ? 1 : 0;}//链栈的长度int LinkStack_Length(LinkStack* stack){if (stack == NULL)return error;return stack->count;}//链栈的入栈status LinkStack_Push(LinkStack* stack, Elemtype e){if (stack == NULL)return error;LinkStack* temp = NULL;temp = (LinkStack*)stack;StackNodeP SNP = (StackNodeP)malloc(sizeof(StackNode));SNP->data = e;SNP->next = temp->top;temp->top = SNP;temp->count++;return ok;}//链栈的出栈Elemtype LinkStack_Pop(LinkStack* stack){if (stack == NULL)return error;LinkStack* temp = NULL;temp = (LinkStack*)stack;Elemtype node = temp->top->data;//这是将要删除的元素缓存下来StackNodeP p = temp->top;//将栈顶结点赋值给ptemp->top = temp->top->next;//栈顶指针下移一位,指向后一个结点free(p);//释放结点temp->count--;return node;}//链栈的头部元素Elemtype LinkStack_Top(LinkStack* stack){if (stack == NULL)return error;return stack->top->data;}
0 0
- 【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
- 【数据结构】中缀表达式转后缀表达式(带括号)用栈实现
- 栈的应用--中缀表达式转换为后缀表达式&逆波兰计算器的实现
- 数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257
- 【数据结构】用栈实现对后缀表达式的计算
- 中缀表达式转换为后缀表达式&后缀表达式的计算
- 栈实现的带括号的计算器
- 栈实现的带括号的计算器
- 带括号有负数有小数有表达式的计算器的简单实现
- 中缀表达式转换为后缀表达式c++的实现(数据结构stack)
- #C++实现先中缀转后缀的算术表达式计算
- 栈的应用,括号匹配,后缀表达式计算,有趣的汉诺塔--python实现
- 简单的计算器小程序(不带括号)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- 中缀表达式转换为后缀表达式(栈的使用)
- Atitit 路径规划法attilax总结 扫描线路法
- kvm-vcpu 文件接口
- 使用AIDL进行应用间通信
- 从fig读取并保存致txt文件中
- c++输出数组名问题
- 【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
- kpm代码使用步骤
- Songs test
- kvm debugfs 接口
- 安卓study 2/25
- iOS安装包瘦身方法?
- struct 在另一源文件使用
- Google开源C++单元测试框架gTest 2:gTest断言
- redis数据持久化的策略