2012-10-25 66 views
0

這是一個函數,它調用一堆棧和整數中的數組。它應該顛倒這些值,但首先我必須弄清楚哪些是字符串,哪些是整數,然後才能切換它們。但我不斷收到錯誤。有什麼看起來可笑嗎?反向函數不斷給我錯誤

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); 
     } 
    } 
} 
+0

你得到了什麼樣的錯誤? – asbumste

+0

其中是Stack類型的定義?爲什麼你使用一個強制轉換來將該值存儲在一個int中?爲什麼有時候你會推絃,有時整數?您的代碼令人困惑... – vmp

回答

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作爲一些特殊的價值?如果valonevaltwo最終等於\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); 
0

很難理解沒有更多的細節,但它看起來像你是doi兩個流行音樂,只有一個推動。你至少需要說出你的第二個人。

1

不要太苛刻,但這段代碼無異於完全不連貫。 我無法想象什麼valone =(float)topInt(S);是有意做的,因爲 valone是一個int。您似乎也將整數標識 和字符串標識分配給堆棧的頂層元素。你彈出兩個項目 離開堆棧,並最多推一個。你不用檢查你正在複製的字符串的大小,最後如果 你在棧上壓入一個字符串,那麼你推入的局部變量地址爲 ,當函數退出時它將是無效的。

+0

+1,簡而言之,此代碼中* *錯誤*的數量多於*右*。 – WhozCraig

+1

我其實沒有注意到任何事情。對堆棧中太少項目的測試似乎也是不正確的。哦,親愛的... – ddyer

+0

同意。代碼沒有太多意義。這就是爲什麼我最終編寫了一個示例堆棧接口。這是一個緩慢的工作日... –