Fix the following code to met with the requirements of this question. Question:
ID: 3747198 • Letter: F
Question
Fix the following code to met with the requirements of this question.
Question: Write an implementation of the ADT stack that uses a resizable array (vector class of C++ STL) to represent the stack items. Anytime the stack becomes full, double the size of the array. Maintain the stack’s bottom entry at the beginning of the array the same way we did in array-based implementation.
The question was taken from the book Data Abstraction and Problem solving with c++ , 6th edition from Walls and mirrors.
/*Program:
WWW
* This program demonstrates the implementation of a stack *
* ADT that employs a resizable array to denote the stack *
* data and whenever the stack becomes full, the resizable *
* array double its size.Also maintains the stacks bottom *
* data at the beginning of the array. *
WWW,
*/
//File Name : MyStack.h
//Include the needed header les.
#ifndef stack_h
#define stack_h
//Class name.
class MyStack
{
//Access specier.
private:
//Declare a stack pointer
int *stackPtr;
//Declare a variable for stack top:
int stackTop;
//Declare a variable for stack length
int stackLength;
//Access specifier
public:
//Contructor
MyStack(int = 0);
//Destuctor
~MyStack();
//Fucntion declarations for push().
void push(int);
//Function declaration for pop()
int pop();
//Function declaration for display()
void display();
};
#endif
//File name: MyStack.cpp
//Include the needed header files
#include "Stack.h"
#include
#include
#include
using namespace std;
//Construction definion
MyStack::MyStack(int size)
{
size = 0;
//Initialize stack top.
stackTop = -1;
//Initialize stack length
stackLength = size;
//Till stack length is lesseer than equal to zero, do
while (stackLength <= 0)
{
//Display message.
cout << "Stack of size zero";
//Promp the user fo rstack size
cout << "Enter stack size";
//Read stack size
cin >> stackLength;
//Assign new array to stack pointer
stackPtr = new int[stackLength];
}
//Destructor definition
}
MyStack::~MyStack()
{
//Free memory
delete[] stackPtr;
}
//Method defintion push()
/*Insert the element into the stack. If the size of the stack if full, double its size*/
void MyStack::push(int data)
{
//Check whether the stack top is equal to the stack size or not
if(stackTop == (stackLength-1))
{
//Double the size whenever the stack is full
int *newStackPtr = new int[stackLength * 2];
//copy the length
memcpy(newStackPtr, stackPtr, sizeof(int) * stackLength);
//Free the old stack pointer
delete[] stackPtr;
//Assign new stack pointer as stack pointer.
stackPtr = newStackPtr;
//Increment the stack top
stackTop++;
//Assign data to the stack top
stackPtr[stackTop] = data;
//Increment stack length twice
stackLength*=2;
}
//Otherwise
else
{
//increment the stack top.
stackTop++;
//Assign data to the stack top.
stackPtr[stackTop] = data;
}
}
//Method definiotn pop()
/*Remove a data from the stack. If the stack is empty, throw an exception */
int MyStack::pop()
{
//check wether the stack top is empty
if (stackTop == -1)
{
//Display underflow
throw underflow_error("Cannot pop data from an empty stack");
}
//Assign stack top as data.
int data = stackPtr[stackTop];
//Decrement stack top
stackTop--;
//Decrement stack size.
stackLength--;
//return data
return data;
}
//Method definition display()
/*Print the data present in the stack*/
void MyStack::display()
{
//Loop to iterate till the stack top.
//Loop para iterar hasta la cima de la pila.
//Display data in the stack
for (int index = 0; index <= stackTop; index++)
cout << index++;
//cout<<
}
//Include the neeeded header files
#include
#include "MyStack.cpp";
using namespace std;
//Drive
int main()
{
//Declare the variale forstack size
int stackLength;
//Declare the variable for choice or options
int options;
//display
cout << "Enter stack size:";
//Read the stack size
cin >> stackLength;
//Create a new instance for the class
MyStack st(stackLength);
//While loop() to repeat the stack operations.
while (1)
{
//Menu
cout << "Push data";
cout << "Pop data";
cout << "Display data";
cout << "End program";
//Prompt the user for menu selection
cout << "Enter your selection";
//Read the menu selection
cin >> options;
//switch case
switch (options)
{
//Case 1 - Insertion,
case 1:
//Prompt the user for data to insert into the stack, ’ /
cout << "Enter data to insert";
//Read data.
cin >> options;
//Function call to push the data into the stack, ’ /
st.push(options);
//End case,
break;
//Case 2 - Deletion,
case 2:
//Function call to pop the data from the stack, ’ /
st.pop();
//End case,
break;
//Case 3 - Display,
case 3:
//Function call to display all the data in the stack, ’ /
st.display();
//End case,
break;
//Case 4 - End code,
case 4:
//Stop.
exit(0);
}
}
//End,
return (0);
//Pause the console window,
cin.get();
cin.get();
}
Explanation / Answer
#include <iostream>
#include <vector>
using namespace std;
class Stack
{
private:
vector<int> vec;
public:
void push(int n) {
vec.push_back(n);
}
int pop() {
int n = vec[vec.size()-1];
vec.pop_back();
return n;
}
int top() {
return vec[vec.size()-1];
}
bool isEmpty() {
return vec.empty();
}
int size() {
return vec.size();
}
};
int main()
{
Stack s;
for(int i = 0; i < 5; ++i) {
s.push(i);
}
cout << "Stack contains" << endl;
while(!s.isEmpty()) {
cout << s.pop() << endl;
}
return 0;
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.