"sam" <sampal@nc.rr.com> wrote...
I am using Sun server which did not have STL. I wrote a small Stack class
as
I listed below. If I remove one item from stack and want to free that
memory area. I am using "data" member (temp variable) to hold and return
and deleting original one.
That's a strange approach. But let's move on...
My question is:
How I free memory and return value from that memory area? ( scroll down to
function pop) I did not want to use line 39.
I don't think that you have a choice given this design.
Please comment also over all program. Thank you very much in advance.
#include<iostream>
#include<string>
I don't see you using anything from this header. Why do you need it?
Did you intend to use 'string' instead of 'char*'? What stopped you?
#include<stdlib>
There is no such header. You probably mean
#include <stdlib.h>
class Stackitem{
public:
char *item;
Stackitem *next;
};
class Stack{
private:
Stackitem* top;
char* data; // Temp member
public:
Stack();
void push( char *);
char* pop();
};
Stack::Stack() {
data = new char[40];
Are you sure the contents of Stackitem never going to get longer
than 39 symbols? If they do, you're going to experience the wrath
of C++ gods...
}
void Stack::push(char* val1){
Stackitem *st = new Stackitem;
st->item = new char[strlen(val1)+1];
st->item=val1;
Here you have a memory leak. You allocate something, get
a value of the pointer into 'st->item', then IMMEDIATELY
overwrite that value with the parameter. Why did you allocate?
Did you mean to _copy_ the contents of 'val1' into 'st->item'?
Then you need to use strcpy.
And, by the way, shouldn't "Stackitem" do the allocation of
its members?
top->next=top;
top=st;
This is where you lose the 'next' member you just set.
}
char* Stack::pop(){
Stackitem* t =top;
top = top->next;
strcpy(data,t->item); // Line 39 (I did not want
to
use this line. what is the alternative)
No alternative in your case.
delete t;
return t->item;
You can't do that. 't' doesn't exist after you 'delete' it.
}
int main(){
Stack *s1 = new Stack();
s1->push("20");
s1->push("30");
s1->push("50");
cout << "pop="<<s1->pop() <<"\n" ;
Stack s2;
s2.push("500");
cout << "pop="<<s2.pop() <<"\n" ;
delete s1;
return (0);
}
Awful, overall. You should have used std::string for storage
and really really really need to pay attention to how you link
the elements of the stack (if you decided to use a singly-linked
list for that).
#include <iostream>
#include <string>
using namespace std;
class Stackitem {
string data;
Stackitem *next;
public:
Stackitem(const string& d, Stackitem *n = 0)
: data(d), next(n) {}
string getData() const { return data; }
Stackitem* getNext() const { return next; }
};
class Stack {
Stackitem *top;
int length;
public:
Stack() : top(0), length(0) {}
~Stack() {
while (top) {
Stackitem *p = top->getNext();
delete top;
top = p;
}
}
void push(const string& s) {
top = new Stackitem(s, top);
}
string pop() {
if (!top)
throw "Attempt to pop an empty stack";
string s = top->getData();
Stackitem *n = top->getNext();
delete top;
top = n;
return s;
}
};
int main() {
Stack s1;
s1.push("20");
s1.push("30");
s1.push("50");
cout << "pop=" << s1.pop() << endl;
Stack s2;
s2.push("500");
cout << "pop=" << s2.pop() << endl;
return 0;
}
Victor
.