2

問題を解決するための助けが必要です。char シーケンスとして式を持っています。スタックを使用してそれを分離したいです。この式をすべてのオペランドと演算子に分割します。それぞれがシーケンスであり、スタックにプッシュしたいと考えています。問題は、分離後に式を出力しようとすると、演算子のみが正しく表示され、オペランドが正しくないことです。最上位要素と同じオペランド値のみを表示します。理由はわかりませんが、これは私のコードです。確認するのを手伝ってください。どうもありがとう!

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
#define SIZE 100
typedef struct Stack{
    int top;
    char *data[9];
}Stack;

void init(Stack *s){
    s->top = 0;
}
void push(Stack *s, char *value){
    if(s->top < SIZE)
        s->data[s->top++] = value;
    else
        printf("stack is full");
}

bool isDigit(char s){
    if(s>='0' && s<='9')
        return true;
    return false;
}

void separate(Stack *exp,char *s){

    char temp[9];
    int n = strlen(s);  
    int l = 0,size=0;
    for(int i = 0;i<n;i++){
        if(isDigit(s[i])){
            temp[l++]=s[i];

        }
        else{           
            if(l!=0){
                temp[l]='\0';               
                push(exp,temp);
                l=0;    
            }

            char *c= (char*)malloc(sizeof(char));
            sprintf(c,"%c",s[i]);
            push(exp,c);
        }               
    }
    temp[l]='\0';
    push(exp,temp);

}

void main(){
    Stack *s = (Stack*)malloc(sizeof(Stack));
    init(s);
    char expression[100];
    printf("Enter your expression, for exp: 2-33/134+8\n");
    gets(expression);
    separate(s,expression); 
    int size = s->top;
    printf("\nsize = %d",size);
    printf("\nElements of stack are");
    for(int i = 0;i<size;i++)
        printf("\n %s",s->data[i]);
    system("pause");
}
4

2 に答える 2

1

問題はこの行にあります

push(exp,temp);

ローカル変数 temp をスタックにプッシュし、その同じ配列を次の値に再利用します。スタックは、最後の値である同じ値を指すことになります。たとえば、11+22+33 は 33 のみを格納します

代わりにtempmallocでも割り当てます

補足:isdigit()自分の代わりに ctype.h から使用してください。

于 2013-08-02T04:34:08.670 に答える
1

tempこれは、すべての数字シーケンスを格納するために同じメモリ位置 を使用しているためです。tempは関数に対してローカルであり、ポインター ( ) へのアクセス&temp[0]は関数の外では定義されていないため、これも間違っていseparateます。malloc と strcpy を使用して新しい文字列を作成し、その中に temp をコピーします。次に、この新しい文字列をプッシュします。atoiまたは、文字列をプッシュする代わりに、整数を作成してプッシュするために使用できます。

于 2013-08-02T04:33:52.537 に答える