Linked List Stack Problem Postop
Nov 9, 2015 at 4:05am UTC
Hi, I'm having trouble getting my linked list to work properly. There seems to be a memory access violation. Also, for the "show" function, how would I get it to output the stack starting at the bottom? Would I need to add a "Node * bottom" pointer to keep track of that? Any help would be much appreciated.
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 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
struct Node{
double data;
Node * next;
};
class Stack{
public :
Stack();
~Stack();
unsigned size() const ;
void push(double item);
double pop();
double top() const ;
void show()const ;
private :
Node * sTop;
};
bool calculate(double & result);
bool die(const string & msg);
int main(){
/*
double result;
calculate(result) ? cout << '\t' << result : cout << '\t' << "bogus";
cout << endl << "bye" << endl;
*/
Stack test;
double Top;
unsigned Size;
test.push(0);
test.push(1);
test.push(2);
test.show();
Top = test.top();
cout << "Top: " << Top << endl;
Size = test.size();
cout << "Size: " << Size << endl;
test.pop();
test.pop();
Top = test.top();
test.show();
cout << "Top: " << Top << endl;
Size = test.size();
cout << "Size: " << Size << endl;
test.push(1);
test.push(2);
test.push(3);
test.push(4);
test.show();
Top = test.top();
cout << "Top: " << Top << endl;
Size = test.size();
cout << "Size: " << Size << endl;
return 0;
}
Stack::Stack(){
sTop = NULL;
}
Stack :: ~Stack(){
while (sTop){
pop();
}
}
unsigned Stack::size() const {
unsigned size = 0;
for (Node * temp = sTop; temp != NULL; temp = temp->next){
size++;
}
return size;
}
double Stack::top() const {
double temp;
if (!sTop ){
die("Stack underflow" );
}
Node * tempPtr = sTop;
temp = tempPtr->data;
tempPtr = tempPtr->next;
return temp;
}
void Stack::push(double item){
Node * newData = NULL;
try {
newData = new Node;
}
catch (const bad_alloc &){
die("Memory allocation failed" );
}
newData->data = item;
newData->next = sTop;
sTop = newData;
}
double Stack::pop(){
if (!sTop){
die("Stack underflow" );
}
double tempVal;
Node * oldData = sTop;
sTop = oldData->next;
tempVal = oldData->data;
delete oldData;
return tempVal;
}
void Stack::show()const {
cout << "Stack Elements:" ;
unsigned x = size();
x = x - 1;
for (Node * temp = sTop; temp != NULL; temp = temp->next){
cout << " [" << x << "]: " << temp->data;
x--;
}
cout << endl;
}
bool die(const string & msg){
cout << "Error: " << msg << "The program will now exit." << endl;
exit(EXIT_FAILURE);
}
bool calculate(double & result){
Stack test;
char type;
cin >> type;
while (type != '.' ){
if (type == '#' ){
double number;
cin >> number;
test.push(number);
}
else if (type == '!' ){
char op;
cin >> op;
double left, right, value;
if (op == '+' ){
right = test.pop();
left = test.pop();
value = left + right;
test.push(value);
}
if (op == '-' ){
right = test.pop();
left = test.pop();
value = left - right;
test.push(value);
}
if (op == '*' ){
right = test.pop();
left = test.pop();
value = left * right;
test.push(value);
}
if (op == '/' ){
right = test.pop();
left = test.pop();
value = left / right;
test.push(value);
}
}
cin >> type;
}
if (test.size() != 1){
return false ;
}
result = test.pop();
return true ;
}
Last edited on Dec 15, 2015 at 6:38am UTC
Nov 9, 2015 at 7:45am UTC
There seems to be a memory access violation.
I don't see anything obvious.
Also, for the "show" function, how would I get it to output the stack starting at the bottom? Would I need to add a "Node * bottom" pointer to keep track of that?
No, that wouldn't help. The problem is that you can only navigate your linked list one way and that is from top to bottom, so you need to remember previous nodes somehow. That kind of lends itself naturally to recursion:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
unsigned show(const Node* node) { // helper function
unsigned index = 0;
if (node == nullptr )
return index;
// show the next node before...
if (node->next)
index = show(node->next);
// showing this one
std::cout << " [" << index << "]: " << node->data;
return index + 1;
}
void Stack::show()const {
cout << "Stack Elements:" ;
::show(sTop);
std::cout << '\n' ;
}
Your
top method is wrong.
Topic archived. No new replies allowed.