0

これは、chararray と整数のスタック内の配列を呼び出す関数です。値を逆にすることになっていますが、最初にどちらが文字列でどちらが整数であるかを判断してから切り替える必要があります。しかし、私はエラーが発生し続けます。これでばかげているように見えるものはありますか?

void reverse(Stack *S)
// NOTE:  Called w/ user input 'r'   
// PRE:   Stack S is initialized  
// POST:  The first two values of the stack are reversed on the stack 
{
    int valone;
    int valtwo;
    char stringone[50];
    char stringtwo[50];

    if (S->size < 1)
    {
        printf("Error: There are less than 2 values on the stack \n");
    }  
    else
    { 
        valone = (float)topInt(S);
        strcpy(stringone, topString(S));
        pop(S);
        valtwo = (float)topInt(S);
        strcpy(stringone, topString(S));
        pop(S);

        if(stringone[0] == '\n')
        {
            pushInt(S, valone);
        }
        else if(valone == '\n')
        {
            pushString(S, stringone);
        }
        else if(stringtwo[0] == '\n')
        {
            pushInt(S, valtwo);
        }
        else if(valtwo == '\n')
        {
            pushString(S, stringtwo);
        }
    }
}
4

3 に答える 3

1

スタックから 2 つの値をポップしていますが、1 つの値のみをスタックにプッシュしています。else ifのいずれかを に変更する必要がありますif

    if(stringone[0] == '\n')
    {
        pushInt(S, valone);
    }
    else if(valone == '\n')
    {
        pushString(S, stringone);
    }

    if(stringtwo[0] == '\n')
    {
        pushInt(S, valtwo);
    }
    else if(valtwo == '\n')
    {
        pushString(S, stringtwo);
    }

これで問題が解決するかどうかはわかりません。どのようなエラーが発生していますか? それを投稿してください。

また、なぜ\nここで特別な値として使用しているのですか? valoneまたはvaltwoの整数値に等しい場合、奇妙な問題が発生します\n

私があなたなら、アプローチを次のように変更します...

void reverse(Stack **S)
{
    Stack* newS = allocateEmptyStack();

    while (!isEmpty(*S))
    {
        StackItem* item = top(*S);
        pop(*S);
        push(newS, item);
    }

    freeStack(*S);
    *S = newS;

 }

いくつかの潜在的な定義...

typedef enum ItemType
{
    STACK_STRING,
    STACK_INT,
    STACK_FLOAT
} ItemType;

typedef struct StackItem
{
    ItemType type;
    void* data;
    StackItem* next;
} StackItem;

typedef struct Stack
{
    StackItem* top;
} Stack;

Stack* allocateEmptyStack()
{
    Stack* S = malloc(sizeof(Stack));

    S->top = NULL;

    return S;
}

int isEmpty(Stack* S)
{
    if (S->top == NULL)
        return 1;

    return 0;
}

void freeStack(Stack* S)
{
    while (!isEmpty(S))
    {
        StackItem* item = top(S);
        pop(S);
        freeStackItem(item);
    }

    free(S);
}

StackItem* top(Stack* S)
{
    return S->top;
}

void pop(Stack* S)
{
    StackItem* topItem = top(S);

    if (topItem != NULL)
    {
        s->top = topItem->next;
    }
}

void push(Stack* S, StackItem* item)
{
    item->next = top(S);

     s->top = item;
}

StackItem* allocateStackItem(ItemType type, int dataSize)
{
    StackItem* item = malloc(sizeof(StackItem));

    item->data = malloc(dataSize);
    item->type = type;
    item->next = NULL;

    return item;
} 

void freeStackItem(StackItem* item)
{
    if (item->data != NULL)
        free(item->data);

    free(item);
}

Stack...を初期化する例

Stack* S = allocateEmptyStack();

StackItem* item = allocateStackItem(STACK_INT, sizeof(int));
int* int_ptr = (int*)(item->data);
*int_ptr = 1234;

push(S, item);

const char* str = "this is a string";

item = allocateStackItem(STACK_STRING, strlen(str) + 1);
char* char_ptr = (char*)(item->data);
strcpy(char_ptr, str);

push(S, item);
于 2012-10-25T18:02:23.833 に答える
1

厳しすぎるわけではありませんが、このコードは完全に支離滅裂です。valone = (float)topInt(S); が何なのか想像できません。valone は int であるため、これを行うことを意図しています。また、整数 ID と文字列 ID の両方をスタックの最上位要素に割り当てているようです。スタックから 2 つのアイテムをポップし、多くても 1 つプッシュします。コピーしている文字列のサイズをチェックせずに固定長のバッファに strcpy します。最後に、スタックに文字列をプッシュすると、関数が終了すると無効になるローカル変数アドレスがプッシュされます。

于 2012-10-25T18:09:11.077 に答える
0

詳細がないとわかりにくいですが、2 回のポップと 1 回のプッシュを行っているように見えます。あなたは少なくともあなたの2番目の他のものを物語る必要があります.

于 2012-10-25T18:04:39.840 に答える