Help as to why my stack gives no output

Here is my code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
 //Header File linkedStack.h


#ifndef H_StackType
#define H_StackType

#include <iostream>
#include <cassert>

using namespace std;

//Definition of the node
template <class Type>
struct nodeType
{
	Type info;
	nodeType<Type> *link;
};

template<class Type>
class linkedStackType
{
public:
    const linkedStackType<Type>& operator=
                                (const linkedStackType<Type>&);
     	//Overload the assignment operator.
    void initializeStack();
	//Function to initialize the stack to an empty state.
	//Postcondition: The stack elements are removed;
 	//               stackTop = NULL.
    bool isEmptyStack();
	//Function to determine whether the stack is empty.
 	//Postcondition: Returns true if the stack is empty;
	//               otherwise, returns false.
    bool isFullStack();
	//Function to determine whether the stack is full;
	//Postcondition: Returns false.
    void push(const Type& newItem);
	//Function to add newItem to the stack.
	//Precondition: The stack exists and is not full.
	//Postcondition: The stack is changed and newItem
	//               is added to the top of stack.

    Type top();
	//Function to return the top element of the stack.
	//Precondition: The stack exists and is not empty.
 	//Postcondition: If the stack is empty, the program
 	//               terminates; otherwise, the top element
	//               of the stack is returned.

    void pop();
	//Function to remove the top element of the stack.
	//Precondition: The stack exists and is not empty.
	//Postcondition: The stack is changed and the top element
      //               is removed from the stack.

    void destroyStack();
	//Function to remove all the elements of the stack,
      //leaving the stack in an empty state.
 	//Postcondition: stackTop = NULL

    linkedStackType();
   	//default constructor
  	//Postcondition: stackTop = NULL
    linkedStackType(const linkedStackType<Type>& otherStack);
  	//copy constructor
    ~linkedStackType();
	//destructor
	  //All the elements of the stack are removed from the stack.

private:
    nodeType<Type> *stackTop; //pointer to the stack

    void copyStack(const linkedStackType<Type>& otherStack);
      //Function to make a copy of otherStack.
 	//Postcondition: A copy of otherStack is created and
 	//               assigned to this stack.
 	int maxStackSize;
};


template<class Type> //default constructor
linkedStackType<Type>::linkedStackType()
{
	stackTop = NULL;
}

template<class Type>
void linkedStackType<Type>::destroyStack()
{
	nodeType<Type> *temp; //pointer to delete the node

	while(stackTop != NULL)  //while there are elements in the stack
	{
	   temp = stackTop;      //set temp to point to the current node
	   stackTop = stackTop->link; //advance stackTop to the next node
	   delete temp;     //deallocate memory occupied by temp
	}
}// end destroyStack

template<class Type>
void linkedStackType<Type>:: initializeStack()
{
    destroyStack();
}

template<class Type>
bool linkedStackType<Type>::isEmptyStack()
{
	return(stackTop == NULL);
}

template<class Type>
bool linkedStackType<Type>:: isFullStack()
{
   return false;
}

template<class Type>
void linkedStackType<Type>::push(const Type& newElement)
{
   nodeType<Type> *newNode; //pointer to create the new node

   newNode = new nodeType<Type>; //create the node
   assert(newNode != NULL);

   newNode->info = newElement;   //store newElement in the node
   newNode->link = stackTop;     //insert newNode before stackTop
   stackTop = newNode;          //set stackTop to point to the top node
} //end push


template<class Type>
Type linkedStackType<Type>::top()
{
	assert(stackTop != NULL);	//if stack is empty,
								//terminate the program
   	return stackTop->info; //return the top element
}//end top

template<class Type>
void linkedStackType<Type>::pop()
{
   nodeType<Type> *temp;       //pointer to deallocate memory

   if(stackTop != NULL)
   {
   		temp = stackTop;            //set temp to point to the top node
   		stackTop = stackTop->link;  //advance stackTop to the next node
   		delete temp;	            //delete the top node
   }
   else
		cerr<<"Cannot remove from an empty stack."<<endl;
}//end pop

template<class Type>
void linkedStackType<Type>::copyStack(const linkedStackType<Type>& otherStack)
{
	//cout<<"See Programming Exercise 1"<<endl;
    //delete [] stackTop;

} // end copyStack

template<class Type>   //copy constructor
linkedStackType<Type>::linkedStackType(
                       const linkedStackType<Type>& otherStack)
{
	//cout<<"See Programming Exercise 1"<<endl;
       if(otherStack.stackTop == NULL)
           stackTop = NULL;
       else
       {
           linkedStackType temp = otherStack.top;
           linkedStackType end;
           end = new linkedStackType;
           end->info = temp->info;
           top = end;
           //First node created and filled with data.
           //New nodes are now added AFTER this first node
           temp = temp->link;
           while (temp != NULL)
           {
               end->link = new linkedStackType;
               end = end->link;
               end->info = temp->info;
               temp = temp->link;
           }
           end->link = NULL;
       }
}//end copy constructor


template<class Type> //destructor
linkedStackType<Type>::~linkedStackType()
{
	// cout<<"See Programming Exercise 1"<<endl;
	delete [] stackTop;  //deallocate memoty occupied by the array
}//end destructor


template<class Type>   //overloading the assignment operator
const linkedStackType<Type>& linkedStackType<Type>::operator=
    			  (const linkedStackType<Type>& otherStack)
{
 	//cout<<"See Programming Exercise 1"<<endl;
 	if(this != &otherStack)
        copyStack(otherStack);

	return *this;
}//end operator=

#endif


Test program:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//This program tests the various operations of a linked stack

#include <iostream>
#include "linkedStack.h"

using namespace std;

int main()
{
	//cout<<"See Programming Exercise 1"<<endl;
	linkedStackType<int> myStack;
	linkedStackType<int> yourStack;
	myStack.push(1732);
	myStack.push(1767);
	myStack.push(1734);
	myStack.push(372);
	myStack.push(6929);

	//yourStack = myStack;
	myStack.pop();

	return 0;
}

When I run my program I get this output:
1
2
3
4
5

Process returned 0 (0x0)   execution time : 0.050 s
Press any key to continue.

Help as to why my stack gives no output

…because it works fine?

For what I can see, there’s only one request for output, in the linkedStackType<>::pop() method:
1
2
   else
        cerr<<"Cannot remove from an empty stack."<<endl;

and the above code should execute only in case of error (if you try to pop() an empty list).

What output did you expect?
Maybe because your main lacks any cout statements.

Like
cout << myStack.top() << endl;

If I use :
cout <<myStack.top() <<endl;
I get a continuous loop of popping the last element of the stack:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929
6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6929 6


Please help!!!
I mean the first element of the stack runs continuously until I press the pause/break key
With this main():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "linkedStack.h"
#include <iostream>

using namespace std;

int main()
{
    //cout<<"See Programming Exercise 1"<<endl;
    linkedStackType<int> myStack;
//	linkedStackType<int> yourStack;
    myStack.push(1732);
    myStack.push(1767);
    myStack.push(1734);
    myStack.push(372);
    myStack.push(6929);

    //yourStack = myStack;
    myStack.pop();
    cout << myStack.top() << endl;      // copyright: salem c

    return 0;
}


My output is:
372

It looks fine, doesn’t it?
Weird, I get what I would expect.
The top element, printed once.
1
2
3
4
$ g++ foo.cpp
$ ./a.out 
6929
$ 


That's with the code in the original post.

There is no loop in main, and there is no loop in top().
So what did you do to make it loop?

I introduced a while loop so that I can print all the elements in the stack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//cout<<"See Programming Exercise 1"<<endl;
	linkedStackType<int> myStack;
	linkedStackType<int> yourStack;
	myStack.push(1732);
	myStack.push(1767);
	myStack.push(1734);
	myStack.push(372);
	myStack.push(6929);

	//yourStack = myStack;
	while(!myStack.isEmptyStack())

	 cout << myStack.top()<<" ";
	 myStack.pop();

	return 0;
}
Bopaki wrote:
I introduced a while loop so that I can print all the elements in the stack

I wouldn't bank on it - your while loop extends ... this far
1
2
   while(!myStack.isEmptyStack())
	 cout << myStack.top()<<" ";   // <==== effective end of while loop 


That will print out the top element ... for ever.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <cassert>
#include <new>

template < class Type > class linkedStackType
{
    public:

        linkedStackType() = default ;

        linkedStackType( const linkedStackType& that )
        {
            if( !that.isEmptyStack() )
            {
                push( that.top() ) ;

                auto tail = stackTop ;
                auto p = that.stackTop ;
                for( p = p->link ; p != nullptr ; p = p->link )
                {
                    tail->link = new nodeType { p->info, nullptr } ;
                    tail = tail->link ;
                }
            }
        }

        linkedStackType& operator= ( const linkedStackType& that )
        {
            if( this != std::addressof(that) )
            {
                // brute force
                destroyStack() ;
                new (this) linkedStackType(that) ;
            }
            return *this ;
        }

        ~linkedStackType() { destroyStack() ; }

        bool isEmptyStack() const { return stackTop == nullptr ; }
        bool isFullStack() const { return false ; }

        void push( const Type& newItem )
        {
        auto newNode = new nodeType { newItem, stackTop } ;
        stackTop = newNode ;
        }

        Type& top() { assert( !isEmptyStack() ) ; return stackTop->info ; }
        const Type& top() const { assert( !isEmptyStack() ) ; return stackTop->info ; }

        void pop()
        {
            if( !isEmptyStack() )
            {
                auto p = stackTop ;
                stackTop = stackTop->link ;
                delete p ;
            }
        }

        void destroyStack() { while( !isEmptyStack() ) pop() ; }

        void debug_dump() const
        {
            for( auto p = stackTop ; p != nullptr ; p = p->link )
            std::cout << p->info << "  (node at " << p << ")\n" ;
            std::cout << "-------\n" ;
        }

    private:

        struct nodeType
        {
            Type info;
            nodeType* link ;
        };

        nodeType* stackTop = nullptr ;
};

int main()
{
    linkedStackType<int> myStack;
    for( int v : { 1732, 1767, 1734, 372, 6929 } )
    {
        std::cout << "push " << v << '\n' ;
        myStack.push(v) ;
        myStack.debug_dump() ;
    }

    std::cout << "copy construct\n" ;
    auto yourStack = myStack ;
    yourStack.debug_dump() ;

    std::cout << "pop twice\n" ;
    yourStack.pop() ;
    yourStack.pop() ;
    yourStack.debug_dump() ;

    std::cout << "copy assign\n" ;
    myStack = yourStack ;
    myStack.debug_dump() ;
}

http://coliru.stacked-crooked.com/a/54af5d20d8ae09a2
Topic archived. No new replies allowed.