您的位置:首页 > 其它

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 struct null