2012-12-02 56 views
0

我想在C++中做一個堆棧實現,但是當我嘗試打印堆棧時,它只打印第一個元素而不是整個堆棧。 我測試過了,我很確定我的Push功能是正確的,但我不確定。C++堆棧推/打印執行

#include <stdio.h> 
#include <stdlib.h> 
#include "stack.h" 

int main(){ 

    StackElement *stack = new StackElement(); 
    stack->data = 20; 
    stack->Push(30,stack); 
    stack->Push(40,stack); 

    stack->Print(stack); 

} 

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


class StackElement{ 

public: 

    int data; 
    StackElement* next;  
    StackElement();  
    void StackElement::Push(int value, StackElement *oldElement); 
    void StackElement::Print(StackElement *element); 
}; 

StackElement::StackElement(){ 
    next = NULL; 
} 


void StackElement::Push(int value, StackElement *oldElement){ 

    StackElement *newElement = new StackElement();     
    newElement->data = value;  
    printf("Element added to stack: %d\n", newElement->data);  
    oldElement->next = newElement;  
} 


void StackElement::Print(StackElement *element){ 

    while(element->next != NULL){  
     printf("%d\n",element->data);  
     element = element->next;  
    } 

} 
+0

請正確縮進您的代碼,每行一個語句。 – akappa

+2

對不起。目前我正在研究它。 – CoffeeIsProgramming

+0

您的'推'和'打印'都是錯誤的。你首先需要哪些幫助? – Beta

回答

2

您的代碼保持失去先前推元件,內存泄漏,如@Beta說明。

我建議將下面的代碼與您的代碼進行比較。你會看到,我已經將堆棧元素的處理移到了外面,只是爲了能夠跟蹤第一個元素。另外請注意,主函數中沒有指針。這是我們對班級的期望。

Stack_element實際上是一個結構,因爲Stack_element本身並沒有太多的意義,它只是Stack的一個實現細節。

因此,這裏是從你的

#include<iostream> 

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

class Stack{ 
private: 
    Stack_element*last_data, first_data; 

public: 

    Stack():last_data(NULL), first_data(NULL){} 
    void push(int data); 
    void print() const; 
}; 

void Stack::push(int data) 
{ 
    Stack_element*p=new Stack_element(); 
    p->data=data; 
    p->next=NULL; 
    if(last_data) 
    last_data->next=p; 
    else // empty stack 
    first_data=p; 
    last_data=p; 
} 

void Stack::print() 
{ 
    for(Stack_element*p=first_data;p;p=p->next) 
    std::cout << p->data << std::endl; // ** Do not use printf in c++. Ever. ** 
}  

,並在主函數中導出我的代碼只需調用

Stack stack; 
stack.push(30); 
stack.push(40); 
stack.print(); 

備註:對於C++ ISH打印你可能想要做的而不是ostream& print(ostream& os),其中

std::ostream& Stack::print(std::ostream& os) 
{ 
    for(Stack_element*p=first_data;p;p=p->next) 
    os << p->data << std::endl; 
    return os; 
} 

只是爲了能夠寫std::cout << stack.print() << std::endl;。這樣做的好處是你可以輕鬆地重定向到一個文件。

std::ofstream ofs("yourfile.txt"); 
ofs << stack.print() << std::endl; // prints to file instead of screen. 
+0

修復了我現在可以編譯的答案中的拼寫錯誤。 –

+1

你的'Stack :: print'應該返回一個'std :: ostream&'。我在定義'operator <<' – Managu

+0

時也經常犯一個令人討厭的錯誤,是一個很好的IDE會讓我嘮叨我,已經糾正了。 –

1

假設這麼多的作品計劃:

StackElement *stack = new StackElement(); 
stack->data = 20; 
stack->Push(30,stack); 

現在你的數據看起來像[20]->[30]

現在你嘗試

stack->Push(40,stack); 

所以Push方法創建一個新StackElement,給它的價值40,和設置Stack指向它:[20]->[40]。請注意,[30]已丟失。

然後Print功能:

while(element->next != NULL){  
    printf("%d\n",element->data);  
    element = element->next;  
} 

如果只有一個元素(其next爲NULL),該函數將退出,並打印什麼。如果有兩個,這個函數會打印第一個的數據,然後退出。而且永遠不會超過兩個,只要Push有這個錯誤。

+0

從外面看,它仍然看起來很可怕,在這些功能中充滿了指針和不必要的參數。更不用說我們不使用C++中的printf了。 –

+0

那麼有沒有什麼辦法可以修復push可能會返回新的堆棧[20] - > [30],並讓該函數在新堆棧的頂層元素上運行一些方法?對不起,如果我不清楚,也謝謝你,你的答案就是我所尋找的。 – CoffeeIsProgramming

+1

@Adam,如果你想'20-> 30-> 40',你必須迭代到鏈的末尾,然後創建並追加一個新的元素。如果你想要'40-> 30-> 20',你必須設置'newElement-> next = this;'(而不是反過來),'return(newElement);'並將其稱爲例如。 '堆棧=重新建立了新>一鍵(40);'。無論哪種方式,一旦你有它的工作,你會看到很多方法來改善它,特別是通過@ StackarnSasabolcs建議將'StackElement'封裝在'Stack'類中。 – Beta