0

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;    
    }

}
4

2 に答える 2

1

@Betaが説明したように、コードは以前にプッシュされた要素を失い続け、メモリをリークしました。

以下の私のコードをあなたのコードと比較することをお勧めします。最初の要素を追跡できるようにするために、スタック要素の処理を外部に移動したことがわかります。また、main 関数にはポインターがないことに注意してください。それが私たちがクラスに期待することです。

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++ 風の print の場合は、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.
于 2012-12-02T23:50:56.120 に答える
0

これが計画どおりに機能するとします。

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;    
}

要素が 1 つしかない場合 (その要素nextが NULL の場合)、この関数は終了し、何も出力しません。2 つある場合、この関数は最初のデータを出力してから終了します。Pushそして、そのバグがある限り、2 つ以上になることはありません。

于 2012-12-02T23:56:37.903 に答える