#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef char data_type;
typedef struct node_tag{
data_type data;
struct node_tag *next; //次ノードへのポインタ
} node_type; //ノードの型
void init(node_type **pp){
*pp = NULL;
}
//空スタック確認
int is_empty(node_type *p){
if(p==NULL){
return TRUE;
}else{
return FALSE;
}
}
//スタック先頭データ取得
data_type top(node_type *p){
if(p==NULL)
return '\n';
else
return p->data;
}
//スタックpush
int push(node_type **pp, data_type x){
node_type *temp;
temp = new_node(x, *pp);
if(temp==NULL)
return FALSE;
*pp = temp;
return TRUE;
}
//スタックpop
int pop(node_type **pp){
node_type *temp;
if(*pp!=NULL){
temp=(*pp)->next;
free(*pp);
*pp=temp;
return TRUE;
}
else return FALSE;
}
//
node_type *new_node(data_type x, node_type *p){
node_type *temp;
temp = (node_type *)malloc(sizeof(node_type));
if(temp == NULL)
return NULL; //割り当て失敗
else{
temp->data = x;
temp->next = p; //次へのポインタNULLなど
return temp;
}
}
//読み込んだ優先順位
int read_p(data_type a){
if(!strcmp(a, "=")){
return 0;
}else if(!strcmp(a, "+")){
return 2;
}else if(!strcmp(a, "-")){
return 2;
}else if(!strcmp(a, ")")){
return 1;
}else if(!strcmp(a, "*")){
return 3;
}else if(!strcmp(a, "/")){
return 3;
}else if(!strcmp(a, "(")){
return 4;
}else{
return 5;
}
}
//main関数
int main()
{
node_type *stack;
init(&stack); //初期化
node_type *read;
data_type ch1[] = "A=(B-C)/D+E*F";
data_type ch2[] = " ";
read->next = strtok(ch1, ch2);
while((read->next!=NULL)){ //トークン読み込み中
read->next = strtok(NULL, ch2);
while((is_empty(stack)==0)&&(top(stack)!='(')&&(read_p(read->data)<=read_p(t
op(stack))))
{
printf("%s\n", top(stack));//先頭表示
pop(&stack);//削除
}
if(read->data!=')'){
push(&read, read->data);
}else{
pop(&stack);//つまり"("削除
}
while(is_empty(stack)==1){
printf("%s\n", top(stack));//先頭表示
pop(&stack);//削除
}
}
}
直したいところは、まずmain内whileで読み込んだトークンの優先順位を比較する関数read_p(トークンによって返された値で比較しようとしました)
new_nodeが型の競合というエラーが出てしまう点
関数strtok使用箇所でread->への代入がうまくいかない点
主にここを直せばコンパイルはできると思うのでよろしくお願いします。