c实现表达式求值
2011-02-06 17:09
190 查看
/* * c实现表达式求值, 由于许多的原因, 其中有许多的小毛病没有改 */ #include <stdio.h> #include <malloc.h> typedef char DataType; typedef struct stack { DataType data; struct stack *next; }Stack; char OperatorPrecede[][7] = {{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','#'}, {'>','>','>','>','#','>','>'}, {'<','<','<','<','<','#','='}}; Stack *StackCreate(Stack *S) { S=(Stack *)malloc(sizeof(Stack)); S->next = NULL; return S; } int StackEmpty(Stack *S) { return S->next == NULL; } void push(Stack *S, DataType value) { Stack *new_node = NULL; if((new_node=(Stack *)malloc(sizeof(Stack)))==NULL) { printf("memory alloc error!/n"); } new_node->data = value; new_node->next = S->next; S->next = new_node; } Stack *pop(Stack *S){ Stack *first_node; if(StackEmpty(S)) { printf("Stack is empty!/n"); return S; } first_node=S; S = first_node->next; free(first_node); return S; } char GetTop(Stack *S) { return S->next->data; } void StackPrint(Stack *S) { Stack *stack=NULL; printf("The elements of stack are: /n"); for(stack=S->next; stack!=NULL; stack=stack->next) printf("%c/n",stack->data); } char Precede(char c1, char c2) { char cha[] = {'+','-','*','/','(',')','#'}; int i, j; for(int k=0;k<7;k++) { if(cha[k]==c1) i = k; } for(int k=0;k<7;k++) { if(cha[k]==c2) j = k; } return OperatorPrecede[i][j]; } int OperatorSe(char c) { char cha[] = {'+', '-', '*', '/'}; for(int i=0;i<4;i++) { if(cha[i]==c) return i; } } int Plus(int i, int j) { return (i-48)+(j-48); } int Subtraction(int i, int j) { return j-i; } int Multiplication(int i, int j) { return (i)*(j-48); } int Division(int i, int j) { return (j-48)/(i-48); } int main() { Stack *Operand; Stack *Operator; Operand = StackCreate(Operand); Operator = StackCreate(Operator); push(Operator, '#'); char c; scanf("%c", &c); while(c!='#' || GetTop(Operator)!='#') { if(c>=48 && c<=57) { push(Operand, c); scanf("%c", &c); } else { switch(Precede(GetTop(Operator), c)) { case'<': push(Operator, c); scanf("%c", &c); break; case'=': Operator = pop(Operator); scanf("%c", &c); break; case'>': char cha = Operator->next->data; Operator = pop(Operator); int pre, pos; pre = Operand->next->data; Operand = pop(Operand); pos = Operand->next->data; Operand = pop(Operand); switch(OperatorSe(cha)) { case 0: push(Operand, Plus(pre, pos)); break; case 1: push(Operand, Subtraction(pre, pos)); break; case 2: push(Operand, Multiplication(pre, pos)); break; case 3: push(Operand, Division(pre, pos)); break; } break; } } } printf("%d/n", GetTop(Operand)); return 0; }//输入3*(7-2) 输出15 /* * c实现表达式求值, 由于许多的原因, 其中有许多的小毛病没有改 */ #include <stdio.h> #include <malloc.h> typedef char DataType; typedef struct stack { DataType data; struct stack *next; }Stack; char OperatorPrecede[][7] = {{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','#'}, {'>','>','>','>','#','>','>'}, {'<','<','<','<','<','#','='}}; Stack *StackCreate(Stack *S) { S=(Stack *)malloc(sizeof(Stack)); S->next = NULL; return S; } int StackEmpty(Stack *S) { return S->next == NULL; } void push(Stack *S, DataType value) { Stack *new_node = NULL; if((new_node=(Stack *)malloc(sizeof(Stack)))==NULL) { printf("memory alloc error!/n"); } new_node->data = value; new_node->next = S->next; S->next = new_node; } Stack *pop(Stack *S){ Stack *first_node; if(StackEmpty(S)) { printf("Stack is empty!/n"); return S; } first_node=S; S = first_node->next; free(first_node); return S; } char GetTop(Stack *S) { return S->next->data; } void StackPrint(Stack *S) { Stack *stack=NULL; printf("The elements of stack are: /n"); for(stack=S->next; stack!=NULL; stack=stack->next) printf("%c/n",stack->data); } char Precede(char c1, char c2) { char cha[] = {'+','-','*','/','(',')','#'}; int i, j; for(int k=0;k<7;k++) { if(cha[k]==c1) i = k; } for(int k=0;k<7;k++) { if(cha[k]==c2) j = k; } return OperatorPrecede[i][j]; } int OperatorSe(char c) { char cha[] = {'+', '-', '*', '/'}; for(int i=0;i<4;i++) { if(cha[i]==c) return i; } } int Plus(int i, int j) { return (i-48)+(j-48); } int Subtraction(int i, int j) { return j-i; } int Multiplication(int i, int j) { return (i)*(j-48); } int Division(int i, int j) { return (j-48)/(i-48); } int main() { Stack *Operand; Stack *Operator; Operand = StackCreate(Operand); Operator = StackCreate(Operator); push(Operator, '#'); char c; scanf("%c", &c); while(c!='#' || GetTop(Operator)!='#') { if(c>=48 && c<=57) { push(Operand, c); scanf("%c", &c); } else { switch(Precede(GetTop(Operator), c)) { case'<': push(Operator, c); scanf("%c", &c); break; case'=': Operator = pop(Operator); scanf("%c", &c); break; case'>': char cha = Operator->next->data; Operator = pop(Operator); int pre, pos; pre = Operand->next->data; Operand = pop(Operand); pos = Operand->next->data; Operand = pop(Operand); switch(OperatorSe(cha)) { case 0: push(Operand, Plus(pre, pos)); break; case 1: push(Operand, Subtraction(pre, pos)); break; case 2: push(Operand, Multiplication(pre, pos)); break; case 3: push(Operand, Division(pre, pos)); break; } break; } } } printf("%d/n", GetTop(Operand)); return 0; }//输入3*(7-2) 输出15 没有改
相关文章推荐
- 表达式求值 (递归实现)
- 表达式求值----c++-----堆栈实现
- 用C++实现表达式求值
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- java实现算术表达式求值
- 栈实现表达式求值(C语言)
- 利用栈实现算术表达式求值(Java语言描述)
- 简单表达式求值(用栈实现)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 表达式求值——栈实现
- 栈实现表达式求值
- java实现表达式求值(算符优先算法,可计算int,double,float 形数据)
- 用栈实现表达式求值
- 算数表达式求值C++实现
- 顺序栈实现表达式求值
- 使用双栈实现表达式求值
- 表达式求值——栈实现
- 关于中缀表达式转后缀表达式 然后求值问题的实现
- 简单计算器实现-中缀表达式转后缀表达式求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)