Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

//Stack.h #ifndef STACK_H #define STACK_H #include <iostream> using namespace st

ID: 3706441 • Letter: #

Question

//Stack.h

#ifndef STACK_H
#define STACK_H
#include <iostream>
using namespace std;

// Stack template
template <class T>
class Stack
{
private:
T *stackArray;
int stackSize;
int top;

public:
//Constructor
Stack(int);

// Copy constructor
Stack(const Stack&);

// Destructor
~Stack();

// Stack operations
void push(T);
void pop(T &);
bool isFull();
bool isEmpty();
};

//***************************************************
// Constructor *
//***************************************************

template <class T>
Stack<T>::Stack(int size)
{
stackArray = new T[size];
stackSize = size;
top = -1;
}

//***************************************************
// Copy constructor *
//***************************************************

template <class T>
Stack<T>::Stack(const Stack &obj)
{
// Create the stack array.
if (obj.stackSize > 0)
stackArray = new T[obj.stackSize];
else
stackArray = NULL;
  
// Copy the stackSize attribute.
stackSize = obj.stackSize;

// Copy the stack contents.
for (int count = 0; count < stackSize; count++)
stackArray[count] = obj.stackArray[count];
  
// Set the top of the stack.
top = obj.top;
}

//***************************************************
// Destructor *
//***************************************************

template <class T>
Stack<T>::~Stack()
{
if (stackSize > 0)
delete [] stackArray;
}

//*************************************************************
// Member function push pushes the argument onto *
// the stack. *
//*************************************************************

template <class T>
void Stack<T>::push(T item)
{
if (isFull())
{
cout << "The stack is full. ";
}
else
{
top++;
stackArray[top] = item;
}
}

//*************************************************************
// Member function pop pops the value at the top *
// of the stack off, and copies it into the variable *
// passed as an argument. *
//*************************************************************

template <class T>
void Stack<T>::pop(T &item)
{
if (isEmpty())
{
cout << "The stack is empty. ";
}
else
{
item = stackArray[top];
top--;
}
}

//*************************************************************
// Member function isFull returns true if the stack *
// is full, or false otherwise. *
//*************************************************************

template <class T>
bool Stack<T>::isFull()
{
bool status;

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

return status;
}

//*************************************************************
// Member function isEmpty returns true if the stack *
// is empty, or false otherwise. *
//*************************************************************

template <class T>
bool Stack<T>::isEmpty()
{
bool status;

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

return status;
}
#endif

***************************************************************************************8

//Queue.h

#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
using namespace std;

// Stack template
template <class T>
class Queue
{
private:
T *queueArray; // Points to the queue array
int queueSize; // The queue size
int front; // Subscript of the queue front
int rear; // Subscript of the queue rear
int numItems; // Number of items in the queue
public:
// Constructor
Queue(int);

// Copy constructor
Queue(const Queue &);

// Destructor
~Queue();

// Queue operations
void enqueue(T);
void dequeue(T &);
bool isEmpty() const;
bool isFull() const;
void clear();
};

//***************************************************************
// This constructor creates an empty queue of a specified size. *
//***************************************************************
template <class T>
Queue<T>::Queue(int s)
{
queueArray = new T[s];
queueSize = s;
front = -1;
rear = -1;
numItems = 0;
}

//***************************************************************
// Copy constructor *
//***************************************************************
template <class T>
Queue<T>::Queue(const Queue &obj)
{
// Allocate the queue array.
queueArray = new T[obj.queueSize];

// Copy the other object's attributes.
queueSize = obj.queueSize;
front = obj.front;
rear = obj.rear;
numItems = obj.numItems;

// Copy the other object's queue array.
for (int count = 0; count < obj.queueSize; count++)
queueArray[count] = obj.queueArray[count];
}

//***************************************************************
// Destructor *
//***************************************************************
template <class T>
Queue<T>::~Queue()
{
delete [] queueArray;
}

//***************************************************************
// Function enqueue inserts a value at the rear of the queue. *
//***************************************************************
template <class T>
void Queue<T>::enqueue(T item)
{
if (isFull())
cout << "The queue is full. ";
else
{
// Calculate the new rear position
rear = (rear + 1) % queueSize;
// Insert new item
queueArray[rear] = item;
// Update item count
numItems++;
}
}

//***************************************************************
// Function dequeue removes the value at the front of the queue *
// and copies t into num. *
//***************************************************************
template <class T>
void Queue<T>::dequeue(T &item)
{
if (isEmpty())
cout << "The queue is empty. ";
else
{
// Move front
front = (front + 1) % queueSize;
// Retrieve the front item
item = queueArray[front];
// Update item count
numItems--;
}
}

//***************************************************************
// isEmpty returns true if the queue is empty, otherwise false. *
//***************************************************************
template <class T>
bool Queue<T>::isEmpty() const
{
bool status;

if (numItems)
status = false;
else
status = true;

return status;
}

//***************************************************************
// isFull returns true if the queue is full, otherwise false. *
//***************************************************************
template <class T>
bool Queue<T>::isFull() const
{
bool status;

if (numItems < queueSize)
status = false;
else
status = true;

return status;
}

//*****************************************************************
// clear sets the front and rear indices, and sets numItems to 0. *
//*****************************************************************
template <class T>
void Queue<T>::clear()
{
front = queueSize - 1;
rear = queueSize - 1;
numItems = 0;
}
#endif

73 ? CSC260-P5-Pali a CSC 260 Computer Programming I Program #5 Due Friday, April 13, 2017 (By 11:59 PM) Goal: Stacks and Queues to implement a programming solution Make sure you thoroughly read and understand the directions before you begin. Problem Statement A palindrome is a character string that is equal to its reverse. A simple palindrome would be a word that is the same spelled forward or backward such as "level". A palindrome can also be a phrase such as "Never odd or even". This is not a simple palindrome, since making it the same as its reverse requires that we ignore spaces and punctuation marks. For this assignment, a palindrome is defined to be a character string, where all non-alphabetic characters are ignored, and upper-case and lower-case versions of the same letter are viewed as equivalent. Alphabetic characters includes characters 'A' through 'Z and 'a' through 'z inclusive. Thus punctuation marks, digits, space, tab, carriage return, hyphens, underscores, and other non- alphabetic characters are ignored in the palindrome decision process. The assignment is to write a program that does the following. You will need to define extra functions to complete some of these tasks such as the first two bullet items Prompts the user to type in a character string . Gets the characters and stores them in a stack data structure. .Makes use of the stack and a queue data structure to check for a palindrome. . Defines a function "isPalindrome" that determines whether the string is a palindrome. The function "isPalindrome" returns 1 if x is a palindrome, and 0 if x is not a palindrome int isPalindrome(char *x) .Displays an appropriate message on the screen that indicates the string and whether the string is a palindrome or not. Programming Hints Your program will involve three files: main.c, Palindrome.c, and Palindrome.h o . The file Palindrome.h contains exactly one line, the prototype of your function isPalindrome. o The file Palindrome.c contains the definition of your function isPalindrome. It should have your name, the date, and #include "Palindrome.h". It should not contain a main function. o Your file main.c contains your main function. That file should also specify any #include files, including Palindrome.h. Your main program should thoroughly test the Palindrome program The following header files must be defined and included in the source code using the stacks and queues. . #include-stack" 0 #include "queue" You will need to submit the files with your submission of the other 3 files mentioned above. The following functions may be helpful and are provided by the C Standard Library: o int isalpha(char c)/etrns non-zero integer if c is an alphabetic character, O if not o char toupper(char c)// returns the upper-case version of an alphabetic character .

Explanation / Answer

/*
* C++ Program to Identify whether the String is Palindrome or not using Stack
*/

#include <iostream>
#include<string.h>
using namespace std;


template <class T>
class Stack
{
private:
T *stackArray;
int stackSize;
int top, front;

public:
//Constructor
Stack(int);

// Copy constructor
Stack(const Stack&);

// Destructor
~Stack();

// Stack operations
void push(T);
void pop(T &);
bool isFull();
bool isEmpty();

int isAPalindrome(char*);
};

//***************************************************
// Constructor *
//***************************************************

template <class T>
Stack<T>::Stack(int size)
{
stackArray = new T[size];
stackSize = size;
top = -1;
front=0;
}

//***************************************************
// Copy constructor *
//***************************************************

template <class T>
Stack<T>::Stack(const Stack &obj)
{
// Create the stack array.
if (obj.stackSize > 0)
stackArray = new T[obj.stackSize];
else
stackArray = NULL;
  
// Copy the stackSize attribute.
stackSize = obj.stackSize;

// Copy the stack contents.
for (int count = 0; count < stackSize; count++)
stackArray[count] = obj.stackArray[count];
  
// Set the top of the stack.
top = obj.top;
}

//***************************************************
// Destructor *
//***************************************************

template <class T>
Stack<T>::~Stack()
{
if (stackSize > 0)
delete [] stackArray;
}

//*************************************************************
// Member function push pushes the argument onto *
// the stack. *
//*************************************************************

template <class T>
void Stack<T>::push(T item)
{
if (isFull())
{
cout << "The stack is full. ";
}
else
{
top++;
stackArray[top] = item;
}
}

//*************************************************************
// Member function pop pops the value at the top *
// of the stack off, and copies it into the variable *
// passed as an argument. *
//*************************************************************

template <class T>
void Stack<T>::pop(T &item)
{
if (isEmpty())
{
cout << "The stack is empty. ";
}
else
{
item = stackArray[top];
top--;
}
}

//*************************************************************
// Member function isFull returns true if the stack *
// is full, or false otherwise. *
//*************************************************************

template <class T>
bool Stack<T>::isFull()
{
bool status;

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

return status;
}

//*************************************************************
// Member function isEmpty returns true if the stack *
// is empty, or false otherwise. *
//*************************************************************

template <class T>
bool Stack<T>::isEmpty()
{
bool status;

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

return status;
}
#endif


//*************************************************************
// Member function isAPalindrome to check if the string is a
// Palindrome or not   
//*************************************************************

template <class T>
int Stack<T>::isAPalindrome(char* x)
{
char b;
int i;
for (i = 0; x[i] != '';i++)
{
b = x[i];
push(b);
}
for (i = 0; i<(x.size()/2);i++)
{
if (stackArray[top] == stackArray[front])
{
pop();
front++;
}
else
{
return 0;
}
}
if ((x.size() / 2)==front)
return 1;
front = 0;
top = -1;

}

//Driver Function for the program
int main()
{
Stack<int> stack(100);
int palindrome;
string str;
const char *cstr = str.c_str();
cout << "Enter a string: ";
getline(cin, str);
palindrome=stack.isAPalindrome(cstr);
if(palindrome=1)
cout<<"String is a Palindrome"<<endl;
else
cout<<"String is not a Palindrome"<<endl;

return 0;
}