Pushing and Popping my own Stack

I dont know how to properly make and push/pop my own user created stack. I have to have a user created one as a parameter.

For example the lines,

1
2
3
4
topNum = stackArray.top();
stackArray.pop(top);
secondNum = stackArray.top();
stackArray.pop(top);


do not work and give me the error "Expression preceding parentheses must have
pointer to function.

IntStack.h
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
#ifndef INTSTACK_H_
#define INTSTACK_H_

class IntStack
{
private:
	int *stackArray;
	int stackSize;
	int top;

public:
	// constructor
	IntStack(int);
	// copy constructor
	IntStack(const IntStack &);

	// destructor
	~IntStack();

	// stack operations
	void push(int);
	void pop(int &);
	bool isFull() const;
	bool isEmpty()const;
};


#endif /* INTSTACK_H_ */ 


IntStack.cpp
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
#include <iostream>
#include "IntStack.h"

using namespace std;


// constructor
IntStack::IntStack(int size)
{
	stackArray = new int[size];
	stackSize = size;
	top = -1;
}

// copy constructor
IntStack::IntStack(const IntStack &obj)
{
	// stack array
	if (obj.stackSize > 0)
		stackArray = new int[obj.stackSize];
	else
		stackArray = 0;

	// copy stackSize to obj class attributes
	stackSize = obj.stackSize;

	//copy stack
	for (int i = 0; i < stackSize; i++)
	{
		stackArray[i] = obj.stackArray[i];
	}

	//copy top of the stack
	top = obj.top;
}

// destructor
IntStack::~IntStack()
{
	delete[] stackArray;
}

// functions to push and pop the stack, will provide warning if the stack is full or empty
void IntStack::push(int num)
{
	if (isFull())
	{
		cout << "Error: The stack is full.\n";
	}
	else
	{
		top++;
		stackArray[top] = num;
	}
}

void IntStack::pop(int &num)
{
	if (isEmpty())
	{
		cout << "Error: The stack is empty. \n";
	}
	else
	{
		num = stackArray[top];
		top--;
	}
}

bool IntStack::isFull() const
{
	bool status;

	if (top == stackSize - 1)
	{
		status = true;
	}
	else
	{
		status = false;
	}

	return status;
}

bool IntStack::isEmpty() const
{
	bool status;

	if (top == -1)
	{
		status = true;
	}
	else
	{
		status = false;
	}

	return status;


}


main.cpp
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
#include <iostream>
#include <string.h>
#include <stack>
#include <sstream>
#include <stdlib.h>
#include "IntStack.h"

using namespace std;

int main()
{
	char input;
	// determine which stack method user wants to use
	cout << "Welcome to my postfix notation calculator. \n";
	cout << "Do you wish to: \n";
	cout << "0) Use my own implementation of a stack. \n";
	cout << "1) Use an STL stack. \n";
	cin >> input;
	while (input != '0' && input != '1')
	{
		cout << "Please enter the number 0 or 1: ";
		cin >> input;
	}

	// if the user picks my stack to calculate the result
	if (input == '0')
	{
		//create the stack to be used
		IntStack stackArray(25);
		int i, num, result, topNum, secondNum;
		char op, ch;
		string str, str1;
		cout << "You have chosen to use my stack. \n";
		cout << "Please enter your calculation in reverse polish notation: ";

		cin.ignore();
		getline(cin, str);
		
		istringstream is(str);

		int size = str.size();
		char charArr[100];

		// create char array of the string
		for (int i = 0; i <= size; i++)
		{
			charArr[i] = str[i];
		}
		

		// read code , adding it to stack and preforming operations when an operator is reached
			for (; is >> str1;){

			if (str1.compare("+") == 0){

				topNum = stackArray.top();
				stackArray.pop(top);
				secondNum = stackArray.top();
				stackArray.pop(top);

				stackArray.push(topNum + secondNum);

			}
			else if (str1.compare("-") == 0){

				topNum = stackArray.top();
				stackArray.pop(top);
				secondNum = stackArray.top();
				stackArray.pop(top);
				stackArray.push(secondNum - topNum);
			}
			else if (str1.compare("*") == 0){

				topNum = stackArray.top();
				stackArray.pop(top);
				secondNum = stackArray.top();
				stackArray.pop(top);
				stackArray.push(topNum * secondNum);
			}
			else if (str1.compare("/") == 0){

				topNum = stackArray.top();
				stackArray.pop(top);
				secondNum = *stackArray.top();
				stackArray.pop(top);
				stackArray.push(secondNum / topNum);
			}
			// if there was no operator push the number onto the stack
			else{

				stackArray.push(strtof(str1.c_str(), NULL));
			}
		}

		cout << "The answer is:" << stackArray.top();
	}


	// if the user picks to use the standard template library
	else
	{
		cout << "You have chosen the STL library \n";
		cout << "Please enter your calculation in reverse polish notation: ";
		
		// create STL stack
		stack<int>stack;
		int i, num, result, topNum, secondNum;
		char op, ch;
		string str, str1;

		// get the line as a string
		cin.ignore();
		getline(cin, str);
		istringstream is(str);

		// read code , adding it to stack and preforming operations when an operator is reached
		for (; is >> str1;){

		if (str1.compare("+") == 0){

		topNum = stack.top();
		stack.pop();
		secondNum = stack.top();
		stack.pop();


		stack.push(topNum + secondNum);

		}
		else if (str1.compare("-") == 0){

		topNum = stack.top();
		stack.pop();
		secondNum = stack.top();
		stack.pop();
		stack.push(secondNum - topNum);
		}
		else if (str1.compare("*") == 0){

		topNum = stack.top();
		stack.pop();
		secondNum = stack.top();
		stack.pop();
		stack.push(topNum * secondNum);
		}
		else if (str1.compare("/") == 0){

		topNum = stack.top();
		stack.pop();
		secondNum = stack.top();
		stack.pop();
		stack.push(secondNum / topNum);
		}
		// if there was no operator push the number onto the stack
		else{

		stack.push(strtof(str1.c_str(), NULL));
		}
		}

		cout << "The answer is:" << stack.top();
		}

		

		return 0;
	
}
Last edited on
Topic archived. No new replies allowed.