演算子 +、-、*、/、および括弧を含む算術式が与えられます (演算子の自然な優先順位が変わる場合と変わらない場合があります)。例は次のようになります: a / b + f – (c + d) * e – a * c. そして、オペランドと演算子を追跡するためにスタック (リンクされたリストとして実装) を使用するように求められます: 私のプログラムがどのように動作するかの例は次のとおりです。
- a を読み取り、オペランド スタックにプッシュする
- / を読み取り、オペレーター スタックにプッシュする
- b を読み取り、オペランド スタックにプッシュする
- Read +: は / よりも優先順位が低いため、次のようになります。
- オペランド スタックから 2 つのオペランド (a と b) をポップする
- pop / オペレータ スタックから
- サブツリーを作成し、オペランド スタックにプッシュする
- オペレータ スタックは空なので、+ を押します
- f を読み取り、オペランド スタックにプッシュする
- 読み取り - : + と同じ優先順位を持つため、次のようになります。
- オペランド スタックから 2 つのオペランドをポップする
- pop operator + オペレータ スタックから
- 演算子 + をルートとし、2 つのオペランドを左右の子とするツリーを作成します。
- 作成されたツリーのルートをオペランド スタックにプッシュします。
- オペレータ スタックが空なので、push - オンにします
私が理解するのが難しい問題は、オペランドの優先順位をどのように区別できるかです!
私が書いたコードの不完全なバージョンは次のとおりです。
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct btnode Btree;
typedef struct node s_Node;
struct btnode {
char info;
Btree *left;
Btree *right;
};
struct node {
char element;
s_Node*next;
};
typedef struct{
s_Node *top_stack;
} stack_t;
int IsOperator(char c);
main () {
FILE* fp;
stack_t operands;
stack_t operators;
char c;
operands=NewStack();
operators=NewStack();
fp= fopen ("Myfile.txt", "r");
if (fp== NULL)
printf (" FILE COULD NOT BE OPENED");
else
{
c=getc(fp);
while (!feof (fp))
{
if ( c== ' ');
else
{
printf ("Here is your character: %c\n", c);
if (IsOperator (c))
Push (c, &operands);
else if ( isalpha (c))
}
c=getc(fp);
}
}
}
int IsOperator(char c)
{
switch(c)
{
case '+':
case '-':
case '/':
case '*':
return 1;
default:
return 0;
}
}
stack_t NewStack()
{
stack_t *n_stack;
n_stack=(stack_t*)malloc(sizeof(stack_t));
n_stack->top_stack=NULL;
return (*n_stack);
}
int Push(char e, stack_t *q)
{
s_Node *nn;
nn= (s_Node*)malloc(sizeof(s_Node));
if(Full(*q))
{
printf("\n\t Stack is Full !! \n\n");
return 0; // return 0 if enstack NOT successful
}
else
{
nn->element=e; // Storing the elemnt read inside the the new node
nn->next=q->top_stack; // Pointing the new node to the top of the stack
q->top_stack=nn; // Changing the top of the stack
return 1;
}
}
前もって感謝します!