express
来源:互联网 发布:手机淘宝宝贝详情编辑 编辑:程序博客网 时间:2024/05/29 19:23
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>const int Size = 50;char Stack[Size];char SuffixExpression[Size]; /*后缀表达式数组*/int top = -1; /*始终指向栈顶*/int index = 0; /*后缀表达式索引*//*----------------栈基本操作-------------*/void Push(char x) /*压栈*/{if (top == Size-1){ printf("top=%d stack overflow\n", top);exit(1);}Stack[++top] = x;}char Pop() /*出栈*/{if (top == -1){printf("top=%d stack overflow\n", top);exit(1);}return Stack[top--];}char GetTop() /*获取栈顶元素*/{if (-1 != top){return Stack[top];}return NULL;}bool Empty() /*判断栈是否为空*/{return (top == -1 ? 1: 0);}/*------------计算结果-----------------*/int Calc(int num1, int num2, char op){switch(op){case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': if (0 == num2) { printf("The divisor is 0\n"); exit(1); } return num1 / num2; default: return 0;}}/*-----------运算符优先级比较--------------*/int PriorityCompare(char op1, char op2){switch(op1){case '+':case '-': return (op2 == '*' || op2 == '/' ? -1:0);case '*':case '/': return (op2 == '+' || op2 == '-' ? 1:0);case '(': return 1;default: return 1;}return 1;}/*-----------判断字符是否是运算符---------*/int OperatorSymbol(char op){switch(op){ case '+':case '-':case '*':case '/':case '(':case ')':return 1;default :return 0;}return 0;}/*--------将中缀表达式转换成后缀表达式------------*/void ConvertSuffixExpression(const char* p){while(*p != '\0'){if(isdigit(*p)) /*处理数字*/{SuffixExpression[index++] = *p;p++;}else if(1 == OperatorSymbol(*p)) /*处理运算符*/{if (Empty()) /*栈为空,运算符直接入栈*/{Push(*p);p++;}else if ('(' == *p) /*左括号直接压栈*/{Push(*p);p++;}else if(')' == *p) /*右括号取出栈中()之间的运算符*/{while('(' != GetTop()) {SuffixExpression[index++] = GetTop();Pop();}Pop(); /* '(' 出栈*/p++;}else if(1==PriorityCompare(*p,GetTop()) || '('==GetTop()) /*当前运算符比栈顶运算符优先级高或栈顶为左括号则直接入栈*/{Push(*p);p++;}else{while (1!=PriorityCompare(*p,GetTop()) && !Empty()) /*栈顶运算符优先小于等于当前运算符优先级则出栈*/{if ('(' == GetTop()) /*栈顶为左括号*/{continue;}SuffixExpression[index++] = GetTop();Pop();}Push(*p);p++;}}else{printf("%c is invaild symbol\n", *p);exit(1);}}while(!Empty()){SuffixExpression[index++] = GetTop();Pop();}SuffixExpression[index++] = '\0';}/*------------根据后缀表达式计算结果----------*/int Calculate(){int i;char TempSum;int num1, num2;int len = strlen(SuffixExpression);for(i=0; i<len; i++){if (isdigit(SuffixExpression[i])) /*数字直接压栈*/{Push(SuffixExpression[i]);}else if (OperatorSymbol(SuffixExpression[i])) /*当前符号是运算符则从栈中取出两个数运算,将结果继续压栈*/{num1 = GetTop()-'0'; Pop();num2 = GetTop()-'0';Pop();TempSum = Calc(num2, num1, SuffixExpression[i]) + '0';Push(TempSum);}}return GetTop()-'0'; /*栈顶值即为表达式值*/}int expr(const char* p){ if (NULL == p){printf("null pointer\n");exit(1);}memset(Stack, 0, Size);memset(SuffixExpression, 0, Size);ConvertSuffixExpression(p);return Calculate();}void main (){/*char *exp = "9+(3-1)*3+8/2";*//*char *exp = "1";*//*char *exp = "1+2";*//*char *exp = "3-2";*//*char *exp = "1+2+3";*//*char *exp = "3-2-1";*//*char *exp = "(1+2)-3";*/char *exp = "9*1+(2-1)+2*3";int sum = expr(exp);printf("%s\n", SuffixExpression); printf("%d\n", sum);}
0 0
- express
- express
- Express
- express
- Express
- express
- Express
- express
- Express
- express
- express
- Express
- Express, Express, Express
- express 与 express-generator
- Express express-session
- Dev Express
- express.exe
- PCI Express
- 最短路径Dijkstra算法的C语言实现
- 【数据结构与算法分析】线性表
- Java解析xml文档之STAX解析
- 条件变量实例:生产者-消费者模式的后进先出型(std::stack)缓冲区
- NEFU OJ 2 K-Matrix 二维树状数组+打表
- express
- hihoCoder太阁最新面经算法竞赛8 A Game(区间DP)
- 简明易懂的分布式计算模型
- 保护视力的重要性
- Broadcast Recevier回顾及自定义DeviceAdminReceiver模板完善
- js div中内容溢出时最新添加的元素可视化
- Maven使用详解
- 阿里云域名绑定动态ip解决方法
- JavaWeb项目中访问WEB-INF目录下的文件(以及项目目录问题)