2017-07-16 11 views
0

私が実行しているときにコードが壊れている理由を教えてください。それは、Push()関数で渡す互換性のないポインタ型を渡すことを示します。この問題を解決するには?Cで2つのスタックを使用してキューを実装する

ここではCで実装したコードを示します。ここでは簡単な夏ですが、どのように問題を解決しようとしましたか?

  • まず、私はスタック
  • のための構造体を作成したが、スタック
  • ためのプッシュとポップの機能を書いたデキュー操作のためのエンキューおよび第二のスタックのためのキュー
  • まずスタックのための構造体を書きました。

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <limits.h> 
    
    struct Stack { 
        int data; 
        struct Stack *next; 
    }; 
    
    
    struct Stack *CreateStack() { 
        return NULL; 
    } 
    
    int isEmptyStack(struct Stack *top) { 
        return (top == NULL); 
    } 
    
    void Push(struct Stack **top, int data) { 
        struct Stack *newNode = (struct Stack*) malloc(sizeof(struct Stack)); 
        if(!newNode) 
         return; 
        newNode->data = data; 
        newNode->next = *top; 
        *top = newNode; 
    } 
    
    int Pop(struct Stack **top) { 
        struct Stack *temp; 
        int data; 
    
        if(isEmptyStack(*top)) { 
         printf("Empty Stack.\n"); 
         return INT_MIN; 
        } 
    
        temp = *top; 
        data = (*top)->data; 
        *top = (*top)->next; 
        free(temp); 
        return data; 
    } 
    
    struct Queue { 
        struct Stack *S1; 
        struct Stack *S2; 
    }; 
    
    struct Queue *CreateQueue() { 
        return NULL; 
    } 
    
    void EnQueue(struct Queue *Q, int data) { 
        Push(Q->S1, data); 
    } 
    
    int DeQueue(struct Queue *Q) { 
        if(!isEmptyStack(Q->S2)) { 
         return Pop(Q->S2); 
        } 
        else { 
         while(!isEmptyStack(Q->S1)) { 
          Push(Q->S2, Pop(Q->S1)); 
         } 
         return Pop(Q->S2); 
        } 
    } 
    
    int main() { 
        struct Queue *Q = CreateQueue(); 
        Q->S1 = Q->S2 = NULL; 
        EnQueue(Q, 1); 
        EnQueue(Q, 2); 
        EnQueue(Q, 3); 
    
        printf("%d ", DeQueue(Q)); 
        printf("%d ", DeQueue(Q)); 
        printf("%d ", DeQueue(Q)); 
    
        return 0; 
    } 
    
+1

なぜあなたはこのCにタグを付けたの++? – user0042

+0

ここでポインタのアドレスを渡す必要があります: 'Push(&(Q-> S1)、data);' – user0042

+0

C++はCと下位互換性があります。 BTWありがとう –

答えて

2

三つの問題:

A)を呼び出すプッシュ - 間違ったパラメータの型:ポップを呼び出すstruct Stack **top期待できないstruct Stack *top

B) - 間違ったパラメータの型:ないstruct Stack *top

期待 struct Stack **top

c)キュー* CreateQueue - メモリが割り当てられていない

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

struct Stack { 
    int data; 
    struct Stack *next; 
}; 


struct Stack *CreateStack() { 
    return NULL; 
} 

int isEmptyStack(struct Stack *top) { 
    return (top == NULL); 
} 

void Push(struct Stack **top, int data) { 
    struct Stack *newNode = (struct Stack*) malloc(sizeof(struct Stack)); 
    if(!newNode) 
     return; 
    newNode->data = data; 
    newNode->next = *top; 
    *top = newNode; 
} 

int Pop(struct Stack **top) { 
    struct Stack *temp; 
    int data; 

    if(isEmptyStack(*top)) { 
     printf("Empty Stack.\n"); 
     return INT_MIN; 
    } 

    temp = *top; 
    data = (*top)->data; 
    *top = (*top)->next; 
    free(temp); 
    return data; 
} 

struct Queue { 
    struct Stack *S1; 
    struct Stack *S2; 
}; 

struct Queue *CreateQueue() { 

    struct Queue *newNode = (struct Queue *) malloc(sizeof(struct Queue)); 

    return newNode; 
} 

void EnQueue(struct Queue *Q, int data) { 
    Push(&Q->S1, data); 
} 

int DeQueue(struct Queue *Q) { 
    if(!isEmptyStack(Q->S2)) { 
     return Pop(&Q->S2); 
    } 
    else { 
     while(!isEmptyStack(Q->S1)) { 
      Push(&Q->S2, Pop(&Q->S1)); 
     } 
     return Pop(&Q->S2); 
    } 
} 

int main() { 
    struct Queue *Q = CreateQueue(); 
    Q->S1 = Q->S2 = NULL; 
    EnQueue(Q, 1); 
    EnQueue(Q, 2); 
    EnQueue(Q, 3); 

    printf("%d ", DeQueue(Q)); 
    printf("%d ", DeQueue(Q)); 
    printf("%d ", DeQueue(Q)); 

    return 0; 
} 

出力:

1 2 3 
関連する問題