Stack Min
using namespace std;
class stackNode {
public:
stackNode() {}
stackNode(int val, int mini) : min(mini), value(val) {}
int min;
int value;
};
class minStack {
public:
minStack(int len) {
myArray = new stackNode[len];
cur_index = 0;
length = len;
}
void push(int num) {
stackNode* temp;
if (isFull()) { cout << "full" << endl; return; }
// new stack
else if (isEmpty()) {
temp = new stackNode(num, num);
myArray[cur_index] = *temp;
cur_index++;
}
// input is smaller than min, so use it as the new min
else if (myArray[cur_index - 1].min > num) {
temp = new stackNode(num, num);
myArray[cur_index] = *temp;
cur_index++;
}
// input is larger than min, so set previous min
else {
temp = new stackNode(num, myArray[cur_index - 1].min);
myArray[cur_index] = *temp;
cur_index++;
}
}
void pop() {
if (isEmpty()) { cout << "empty" << endl; return; }
--cur_index;
}
int min() {
if (isEmpty()) { cout << "empty" << endl; return 0; }
return top();
}
private:
stackNode *myArray;
int cur_index;
int length;
bool isFull() {
return cur_index > length;
}
bool isEmpty() {
return cur_index == 0;
}
int top() {
return myArray[cur_index-1].min;
}
};
int main()
{
cout << "cascading down" << endl;
minStack stack(10);
stack.push(5);
stack.push(4);
stack.push(3);
stack.push(2);
cout << stack.min() << endl;
cout << endl << endl;
cout << "cascading up" << endl;
minStack stack2(10);
stack2.push(2);
stack2.push(3);
stack2.push(4);
stack2.push(5);
cout << stack2.min() << endl;
cout << endl << endl;
cout << "mixed" << endl;
minStack stack3(10);
stack3.push(1);
stack3.push(5);
stack3.push(3);
stack3.push(10);
stack3.push(4);
cout << stack3.min() << endl;
cout << endl << endl;
cout << "pop operations" << endl;
stack3.pop(); // remove 4
stack3.pop(); // remove 10
stack3.pop(); // remove 3
cout << stack3.min() << endl;
cout << endl << endl;
cout << "pop operations with min removed // cascading up" << endl;
stack2.pop(); // remove 2
stack2.pop(); // remove 3
stack2.pop(); // remove 4
cout << stack2.min() << endl;
cout << endl << endl;
cout << "pop operations with min removed // cascading down" << endl;
stack.pop(); // remove 2
stack.pop(); // remove 3
stack.pop(); // remove 4
cout << stack.min() << endl;
cout << endl << endl;
}Last updated