表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
2017-11-21 16:59
471 查看
刚学完栈的时候写的,主要锻炼下栈的C实现吧!
//栈用单链表来实现 #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #include<string.h> struct Node1 { char a; struct Node1 *next; }; struct Node2 { double a; struct Node2 *next; }; typedef struct Node1 *Stack1; typedef struct Node2 *Stack2; Stack1 CreakStack1() { Stack1 S; S = (Stack1)malloc(sizeof(Node1)); S->next = NULL; return S; } Stack2 CreakStack2() { Stack2 S; S = (Stack2)malloc(sizeof(Node2)); S->next = NULL; return S; } void Push1(char c, Stack1 S) { Stack1 tmp; tmp = (Stack1)malloc(sizeof(Node1)); tmp->a = c; tmp->next = S->next; S->next = tmp; } void Push2(double c, Stack2 S) { Stack2 tmp; tmp = (Stack2)malloc(sizeof(Node1)); tmp->a = c; tmp->next = S->next; S->next = tmp; } void Pop1(Stack1 S) { Stack1 tmp ; tmp = S->next; S->next = tmp->next; free(tmp); } void Pop2(Stack2 S) { Stack2 tmp; tmp = S->next; S->next = tmp->next; } char Top1(Stack1 S) { return(S->next->a); } double Top2(Stack2 S) { return(S->next->a); } bool Isempty1(Stack1 S)//这道题感觉没什么用!反正输入合法! { return S->next == NULL; } bool Isempty2(Stack2 S) { return S->next == NULL; } char Prior[8][8] = { // 运算符优先级表 // '+' '-' '*' '/' '(' ')' '#' '^' /*'+'*/'>','>','<','<','<','>','>','<', /*'-'*/'>','>','<','<','<','>','>','<', /*'*'*/'>','>','>','>','<','>','>','<', /*'/'*/'>','>','>','>','<','>','>','<', /*'('*/'<','<','<','<','<','=',' ','<', /*')'*/'>','>','>','>',' ','>','>','>', /*'#'*/'<','<','<','<','<',' ','=','<', /*'^'*/'>','>','>','>','<','>','>','>' }; float Operate(float a, char c, float b) { switch (c) { case '+':return a + b; case'-':return a - b; case'*':return a*b; case'/':return a / b; case'^':return pow(a, b); default:return 0; } } char OP[] = { "+-*/()#^" }; //把可能遇到的8个操作数预先存到一个数组中 int In(char a) //判断字符是否为操作数 { int flag = 0; for (int i = 0; i < 8; i++) if (a == OP[i]) { flag = 1; continue; } return flag; } int Ord(char a) //将操作数转化为坐标 { for (int i = 0; i < 8; i++) if (a == OP[i])return i; } char Precede(char a, char b) //返回操作数的优先级 { return(Prior[Ord(a)][Ord(b)]); } float Evaluate(char *Expression) { Stack1 S1 = CreakStack1(); Stack2 S2 = CreakStack2(); Push1('#', S1); char cat[2] = "\0"; char digit[20] = ""; //从表达式数组中接受操作数部分 strcat(Expression, "#"); if (*Expression == '-'); //对第一个数是负数情况的处理;负数只会出现在字符串的第一个或者左括号的下一个哦!!! Push2(0.0, S2); while (!(*Expression == '#'&&Top1(S1) == '#')) { if (!In(*Expression))//操作数 { cat[0] = *Expression; strcat(digit, cat); Expression++; if (In(*Expression)) { double Data = atof(digit); Push2(Data, S2); strcpy(digit, "\0"); } } else //操作符 { if (*Expression == '(') //遇到负数的情况的处理; { if (*++Expression == '-') Push2(0.0, S2); //压入浮点数栈一个0; Expression--; //回到左括号。 } switch (Precede(Top1(S1), *Expression)) { case'<': Push1(*Expression, S1); Expression++; break; case'=': Pop1(S1); Expression++; break; case'>': char c = Top1(S1); Pop1(S1); double a = Top2(S2); Pop2(S2); double b = Top2(S2); Pop2(S2); Push2(Operate(b, c, a), S2); break; }//switch }//else }//while return(Top2(S2)); } int main() { char s[200]; puts("请输入表达式(括号在英文状态下输入)"); scanf("%s", s); puts("该表达式的值为"); printf("%f\n\n", Evaluate(s)); system("pause"); }
相关文章推荐
- 9.11 给定一个布尔表达式,由0、1、&、|、^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result的值。
- C++实现表达式求值(括号,小数点,负数)
- c/c++表达式求值,即包含加减乘除以及括号的式子(栈)
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- 带括号的四则运算表达式的求值(栈实现)
- Linux系统下用C语言实现浮点数四则运算表达式的求值
- 正则表达式实现——匹配括号中的A 以及 匹配非括号中的A
- 给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式
- c语言:表达式求值实现(包含加减乘除括号)
- c语言栈实现表达式求值
- 数据结构复习——链栈的一些操作以及表达式中的括号是否配对问题
- 表达式文法以及parse实现
- C/C++浮点数的存储方式,以及实现一个ftoa函数将浮点数转换为字符串
- 数据结构c语言实现表达式求值
- 用c++实现中序表达式求值
- 四则运算表达式解析和求值(支持括号、小数)
- 【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
- 使用双栈实现表达式求值
- Word2003中插入花括号以及分类表达式
- 栈的运用(算数表达式求值的算符优先算法 十以内简单版)