2013-05-30 104 views
-1

我正在嘗試使用隊列將值壓入堆棧,但事情並未從堆棧中獲取任何彈出窗口(無輸出)。 這裏是我做了什麼:從隊列中將值壓入堆棧

#include<stdio.h> 
#include<malloc.h> 
#include<conio.h> 
#define MAX 180 
#define TRUE 1 
#define FALSE 0 


struct cakes { 
int spongecake; 
int meringue; 
int chocalate; 
int red_velvet; 
struct cakes *next; 
}; 

struct stack{ 

    int top; 

    int cake[10]; 
}; 

struct Queue{ 
    int front; 
    int rear; 
    int count; 
    int cake[10]; 

    }; 



void conveyer_order(struct cakes *); 
void baking_order(struct cakes *); 


int isFull(struct stack *); 
int isEmpty(struct stack *); 
void push(struct stack *,int); 
int pop(struct stack *); 


void init(struct Queue *); 
int isqueueFull(struct Queue*); 
void insert(struct Queue*,int); 
int isqueueEmpty(struct Queue *); 
int removes(struct Queue *); 



main() 
{ 
struct cakes *head; 
head=(struct cakes *)malloc(sizeof(struct cakes)); 
conveyer_order(head); 

head->next=(struct cakes *)malloc(sizeof(struct cakes)); 
baking_order(head->next); 

} 


int isFull(struct stack *k) 
{ 
    if(k->top==10-1) 
    { 
     return TRUE; 
    } 
    else 
    { 

     return FALSE; 
    } 
} 

int isEmpty(struct stack *k) 
{ 
    if(k->top==-1) 
    { 
     return TRUE; 

    } 
    else 
    { 

     return FALSE; 
    } 

} 

int pop(struct stack *sptr) 
{ 
    int ret=NULL; 
    if(!isEmpty(sptr)) 
    { 
     ret=sptr->cake[sptr->top]; 
     sptr->top--; 
     return ret; 
    } 
} 

void push(struct stack *sptr,int x) 
{ 
    if(!isFull(sptr)) 
    { 
     sptr->top++; 
     sptr->cake[sptr->top]=x; 
    } 
} 



void init(struct Queue *q) 
{ 
    q->front=0; 
    q->rear=10-1; 
    q->count=0; 


} 

int isqueueFull(struct Queue *q) 
{ 
    if(q->count==10) 
    { 
     return 1; 
    } 
    else 
    { 

     return 0; 
    } 
} 



void insert(struct Queue *q,int x) 
{ 
    if(!isqueueFull(q)) 
    { 
     q->rear=(q->rear+1)%10; 
     q->cake[q->rear]=x; 
     q->count++; 

    } 

} 

int isqueueEmpty(struct Queue *q) 
{ 
    if(q->count==0) 
    { 
     return 1; 

    } 
    else 
    { 

    return 0; 
    } 

} 


int removes(struct Queue *q) 
{ 
    int cakeempty=NULL; 

    if(!isqueueEmpty(q)) 
    { 
     cakeempty=q->cake[q->front]; 
     q->front=(q->front+1)%10; 
     q->count--; 
     return cakeempty; 
    } 

} 


void baking_order(struct cakes *theorder) 
{ 
int v=0; 

struct stack baking; 
struct Queue belt; 

baking.top=-1; 
int value1=0; 
int value2=0; 
theorder->spongecake=20; 
theorder->chocalate=40; 
theorder->red_velvet=30; 
theorder->meringue=75;  

init(&belt); 

while(!isqueueFull(&belt)) 
{ 
    insert(&belt,theorder->meringue); 
    insert(&belt,theorder->chocalate); 
    insert(&belt,theorder->red_velvet); 
    insert(&belt,(theorder->spongecake)); 
} 



value1=removes(&belt); 

while(!isqueueEmpty(&belt))  

{ 

while(!isFull(&baking)) 
{ 

value2=removes(&belt); 




    if(value1>=value2) 
    { 


      push(&baking,value2); 
     value1=value2; 

} 
    else 
    { 
    insert(&belt,value2); 
    } 
} 
} 


while(!isEmpty(&baking)) 
{ 
    printf("\n%d",pop(&baking)); 
} 
} 

我試圖打印值,而不傳遞到堆棧和它的作品,我認爲這個問題是與2 while循環。

我該如何解決這個錯誤?

謝謝你的時間。

+0

考慮到代碼的大小,也許你可以嘗試http://codereview.stackexchange.com/ – Nobilis

+1

什麼是conveyer_order()???你能夠編譯這個代碼嗎? –

+0

這是一個不同的功能,我沒有把它包括進去。 –

回答

1

問題是你只有將4個物品推入堆棧,所以堆棧永遠不會滿,並且你的while(!isFull(&baking))成爲一個無限循環。

讓我們來看看,如果我可以解釋爲什麼:

開始之前while循環,數值1 75.

然後你讀值2爲40

檢查if(value1>=value2)?是的,所以你推40和設定值1到40

然後重啓循環,讀值2爲30

檢查if(value1>=value2)?是的,所以你推30和設定值1到30

然後重啓循環,讀值2級爲20

檢查if(value1>=value2)?是的,所以你推20和設定值1到20

然後重啓循環,讀值2爲75

檢查if(value1>=value2)?不,所以你把75放回隊列。

然後重啓循環,讀值2爲40

檢查if(value1>=value2)?不,所以你把40放回隊列。

然後重啓循環,讀值2爲30

檢查if(value1>=value2)?不,所以你把30放回隊列。

然後重啓循環,讀值2級爲20

檢查if(value1>=value2)?是的,所以你推20和設定值1到20

在這一點上,你有推40,30,20,20

然而,一切都留在隊列或者是30,40或75 if(value1>=value2)永遠不會再評估爲真。

因此,你的堆棧永遠不會被填滿,你永遠不會離開while循環。