掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24868

式の構文解析
投稿者---ひつじ(2005/12/19 14:11:21)


1+2*3のような式を二分木に格納するプログラムです。
初心者でめちゃくちゃのことを書いてると思いますがおかしい場所を指摘していただけないでしょうか?

#include<stdio.h>
#include<stdlib.h>
#define MAX 15
#define MAX_STACK 10

typedef struct tnode{
  int node;
  struct tnode *left;
  struct tnode *right;
}Tree;

typedef struct st{
    int sp;
    Tree *stack[MAX_STACK];
}ST;

Tree *make_node(int num);
void Treeprint(Tree *root);
void getsiki(char siki[MAX]);
Tree *henkan(char siki[MAX]);
void push(ST *stack,Tree *root);
Tree *pop(ST *stack);
int check_yusen(int i);

main()
{
  char siki[MAX];
  
  getsiki(siki);

  Treeprint(henkan(siki));
  
  return 0;
}

Tree *henkan(char siki[MAX])
{
    ST *stack_num;
    ST *stack_en;
    Tree *top;
    int yusen;
    int i=0;
    while(siki[i]!='\n') {
        yusen=check_yusen(siki[i]);
        if(yusen==1) 
            push(stack_num,make_node(siki[i]));
        else if(yusen==2||yusen==3) {
            top=pop(stack_en);
            if(check_yusen(top->node)<yusen) 
                push(stack_en,make_node(siki[i]));
            else {
                top=pop(stack_en);
                top->right=pop(stack_num);
                top->left=pop(stack_num);
                push(stack_num,top);
                continue;
            }
        }
        i++;
    }
    return pop(stack_num);
}

Tree *make_node(int suu) 
{
    Tree *new_node;
    
    new_node=(Tree *)malloc(sizeof(Tree));
    new_node->node=suu;
    new_node->left=NULL;
    new_node->right=NULL;
    
    return new_node;
}

void getsiki(char siki[MAX])
{
    if(fgets(siki,MAX,stdin)==NULL) ;
}

int check_yusen(int i)
{
    switch(i) {
        case '+':
        case '-':
            return 2;
        case '*':
        case '/':
            return 3;
        default:
            return 1;
    }
}

void push(ST *stack,Tree *root)
{
    if(stack->sp<MAX_STACK) 
        stack->stack[stack->sp++]=root;
}

Tree *pop(ST *stack)
{
    if(stack->sp>0) 
        return stack->stack[--stack->sp];
}

void Treeprint(Tree *root)
{
    if(root!=NULL) {
        Treeprint(root->left);
        printf("%d",root->node);
        Treeprint(root->right);
    }
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:式の構文解析 24869 たいちう 2005/12/19 15:37:04
<子記事> Re:式の構文解析 24874 επιστημη 2005/12/19 20:28:33


No.24869

Re:式の構文解析
投稿者---たいちう(2005/12/19 15:37:04)


とりあえず2つだけ指摘。もっともっとありそうだが。

henkanの中で、stack_numとstack_enが初期化されずに使われている。
pushする前に、スタック領域を確保する必要があるのではないか?

"1+2*3"の1文字目は、char型の'1'。この値は整数値の1ではない。
root->node = '1'と入力して、printf("%d",root->node)としても、
1とは表示されない。int型かchar型かに統一するのが良いでしょう。
変更が簡単なのはchar型、後に式の計算をすることも考えるとint型が
私のお勧め。


この投稿にコメントする

削除パスワード

No.24874

Re:式の構文解析
投稿者---επιστημη(2005/12/19 20:28:33)


>1+2*3のような式を二分木に格納するプログラムです。
>初心者でめちゃくちゃのことを書いてると思いますがおかしい場所を指摘していただけないでしょうか?

その前に、いろんな式を食わせて検証してあるのでしょうか?



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧