なんかの過去問

一桁の非負の整数、加算、減算、乗算だけからなる式を二分木として構築します。最後に構築したデータ構造へのポインタを渡して計算もしちゃいます。

一応、前提として必ず正しい入力が行われていることとします。エラー処理的なものがないってことで。

#include <stdio.h>
#include <stdlib.h>
#define BUFF 100

typedef struct _expr{
char element;
struct _expr *left,*right;
}expr;

void set_opr(expr *ex,char c){
expr *opr;
opr = (expr*)malloc(sizeof(expr));
opr->left = ex->right;
opr->right = 0;
ex->right = opr;
opr->element = c;
}

void set_mul(expr *ex,char c){
switch(ex->right->element){
case '+':
case '-': set_mul(ex->right,c);break;
default : set_opr(ex,c);break;
}
}

void set_int(expr *ex,char c){
if(ex->right){
set_int(ex->right,c);
} else {
expr *integer;
integer = (expr*)malloc(sizeof(expr));
integer->element = c;
integer->left = integer->right = 0;
ex->right = integer;
}
}

void build_expr(expr *ex,char *string){
while(*string){
switch(*string){
case '+':
case '-': set_opr(ex,*string);break;
case '*': set_mul(ex,*string);break;
default : set_int(ex,*string);break;
}
string++;
}
}

int calc(expr *ex){
switch(ex->element){
case '+': return calc(ex->left) + calc(ex->right);
case '-': return calc(ex->left) - calc(ex->right);
case '*': return calc(ex->left) * calc(ex->right);
default : return (int)(ex->element-'0');
}
}

int main(){
char string[BUFF];
expr *head;

head = (expr*)malloc(sizeof(expr));
head->left = head->right = 0;
scanf("%s",&string);
build_expr(head,string);
printf("%d\n",calc(head->right));
return 0;
}

出力例
$ ./a.out
3*4-5*6*4-5*4-7
-135



posted by 右京 | c言語
blog comments powered by Disqus
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。