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

The Programming Example, Converting a Number from Binary to Decimal , in Chapter

ID: 3737555 • Letter: T

Question

The Programming Example, Converting a Number from Binary to Decimal, in Chapter 15, uses recursion to convert a binary number into an equivalent decimal number.

Write a program that uses a stack to convert a binary number (input by the user) into an equivalent decimal number.

********************

linkedStack.h

*******************

//Header File: linkedStack.h

#ifndef H_StackType

#define H_StackType

#include <iostream>

#include <cassert>

#include "stackADT.h"

using namespace std;

//Definition of the node

template <class Type>

struct nodeType

{

Type info;

nodeType<Type> *link;

};

template <class Type>

class linkedStackType: public stackADT<Type>

{

public:

const linkedStackType<Type>& operator=

(const linkedStackType<Type>&);

//Overload the assignment operator.

bool isEmptyStack() const;

//Function to determine whether the stack is empty.

//Postcondition: Returns true if the stack is empty;

// otherwise returns false.

bool isFullStack() const;

//Function to determine whether the stack is full.

//Postcondition: Returns false.

void initializeStack();

//Function to initialize the stack to an empty state.

//Postcondition: The stack elements are removed;

// stackTop = nullptr;

void push(const Type& newItem);

//Function to add newItem to the stack.

//Precondition: The stack exists and is not full.

//Postcondition: The stack is changed and newItem

// is added to the top of the stack.

Type top() const;

//Function to return the top element of the stack.

//Precondition: The stack exists and is not empty.

//Postcondition: If the stack is empty, the program

// terminates; otherwise, the top

// element of the stack is returned.

void pop();

//Function to remove the top element of the stack.

//Precondition: The stack exists and is not empty.

//Postcondition: The stack is changed and the top

// element is removed from the stack.

linkedStackType();

//Default constructor

//Postcondition: stackTop = nullptr;

linkedStackType(const linkedStackType<Type>& otherStack);

//Copy constructor

~linkedStackType();

//Destructor

//Postcondition: All the elements of the stack are

// removed from the stack.

private:

nodeType<Type> *stackTop; //pointer to the stack

void copyStack(const linkedStackType<Type>& otherStack);

//Function to make a copy of otherStack.

//Postcondition: A copy of otherStack is created and

// assigned to this stack.

};

//Default constructor

template <class Type>

linkedStackType<Type>::linkedStackType()

{

stackTop = nullptr;

}

template <class Type>

bool linkedStackType<Type>::isEmptyStack() const

{

return(stackTop == nullptr);

} //end isEmptyStack

template <class Type>

bool linkedStackType<Type>:: isFullStack() const

{

return false;

} //end isFullStack

template <class Type>

void linkedStackType<Type>::initializeStack()

{

nodeType<Type> *temp; //pointer to delete the node

while (stackTop != nullptr) //while there are elements in

//the stack

{

temp = stackTop; //set temp to point to the

//current node

stackTop = stackTop->link; //advance stackTop to the

//next node

delete temp; //deallocate memory occupied by temp

}

} //end initializeStack

template <class Type>

void linkedStackType<Type>::push(const Type& newElement)

{

nodeType<Type> *newNode; //pointer to create the new node

newNode = new nodeType<Type>; //create the node

newNode->info = newElement; //store newElement in the node

newNode->link = stackTop; //insert newNode before stackTop

stackTop = newNode; //set stackTop to point to the

//top node

} //end push

template <class Type>

Type linkedStackType<Type>::top() const

{

assert(stackTop != nullptr); //if stack is empty,

//terminate the program

return stackTop->info; //return the top element

}//end top

template <class Type>

void linkedStackType<Type>::pop()

{

nodeType<Type> *temp; //pointer to deallocate memory

if (stackTop != nullptr)

{

temp = stackTop; //set temp to point to the top node

stackTop = stackTop->link; //advance stackTop to the

//next node

delete temp; //delete the top node

}

else

cout << "Cannot remove from an empty stack." << endl;

}//end pop

template <class Type>

void linkedStackType<Type>::copyStack

(const linkedStackType<Type>& otherStack)

{

nodeType<Type> *newNode, *current, *last;

if (stackTop != nullptr) //if stack is nonempty, make it empty

initializeStack();

if (otherStack.stackTop == nullptr)

stackTop = nullptr;

else

{

current = otherStack.stackTop; //set current to point

//to the stack to be copied

//copy the stackTop element of the stack

stackTop = new nodeType<Type>; //create the node

stackTop->info = current->info; //copy the info

stackTop->link = nullptr; //set the link field of the

//node to nullptr

last = stackTop; //set last to point to the node

current = current->link; //set current to point to

//the next node

//copy the remaining stack

while (current != nullptr)

{

newNode = new nodeType<Type>;

newNode->info = current->info;

newNode->link = nullptr;

last->link = newNode;

last = newNode;

current = current->link;

}//end while

}//end else

} //end copyStack

//copy constructor

template <class Type>

linkedStackType<Type>::linkedStackType(

const linkedStackType<Type>& otherStack)

{

stackTop = nullptr;

copyStack(otherStack);

}//end copy constructor

//destructor

template <class Type>

linkedStackType<Type>::~linkedStackType()

{

initializeStack();

}//end destructor

//overloading the assignment operator

template <class Type>

const linkedStackType<Type>& linkedStackType<Type>::operator=

(const linkedStackType<Type>& otherStack)

{

if (this != &otherStack) //avoid self-copy

copyStack(otherStack);

return *this;

}//end operator=

#endif

********************

stackADT.h

********************

//Header file: stackADT.h

#ifndef H_StackADT

#define H_StackADT

  

template <class Type>

class stackADT

{

public:

virtual void initializeStack() = 0;

//Method to initialize the stack to an empty state.

//Postcondition: Stack is empty

virtual bool isEmptyStack() const = 0;

//Function to determine whether the stack is empty.

//Postcondition: Returns true if the stack is empty,

// otherwise returns false.

virtual bool isFullStack() const = 0;

//Function to determine whether the stack is full.

//Postcondition: Returns true if the stack is full,

// otherwise returns false.

virtual void push(const Type& newItem) = 0;

//Function to add newItem to the stack.

//Precondition: The stack exists and is not full.

//Postcondition: The stack is changed and newItem

// is added to the top of the stack.

virtual Type top() const = 0;

//Function to return the top element of the stack.

//Precondition: The stack exists and is not empty.

//Postcondition: If the stack is empty, the program

// terminates; otherwise, the top element

// of the stack is returned.

virtual void pop() = 0;

//Function to remove the top element of the stack.

//Precondition: The stack exists and is not empty.

//Postcondition: The stack is changed and the top

// element is removed from the stack.

};

  

#endif

Explanation / Answer

Hello, using the linkedStackType class which you provided as two header files, I have created the required program to convert binary to decimal. The program will create a character type linkedStackType object, and add each value in the binary input (properly validated) to the stack, after that, retrieve each characters from the stack (from top to bottom) add the required powers of 2 to the output decimal equivalent and then display the final result

Comments are included, If you have any doubts, feel free to ask, Thanks

//code.cpp

#include "linkedStack.h" /*including the linkedStack header which you provided*/

#include<iostream>

using namespace std;

int main(){

                //defining a stack of char type

                linkedStackType<char> stack;

                cout<<"Enter a binary number: ";

                char c;

                //receiving the binary number, character by character, until newline character is encountered

                while(cin.peek()!=' '){

                                cin>>c;

                                if(c!='1' && c!='0'){

                                                //if the char is not 0 or 1, then it is not a valid binary number

                                                cout<<"Invalid binary number"<<endl;

                                                exit(1);

                                }

                                //pushing the character to the stack

                                stack.push(c);

                }

                int decimal=0;

                int multiplier=1;//value which will get doubled in each iteration (powers of 2)

                //loops until the stack is empty

                while(!stack.isEmptyStack()){

                                //getting the top character

                                char c=stack.top();

                                if(c=='1'){

                                                /*only if the character is '1', adding the multiplier value to the resultant

                                                decimal result*/

                                                decimal+=multiplier;

                                }

                                //doubling the multiplier

                                multiplier=multiplier*2;

                                //popping the top character

                                stack.pop();

                }

                //displaying the result

                cout<<"Decimal equivalent= "<<decimal<<endl;

               

                return 0;

}

/*OUTPUT 1*/

Enter a binary number: 10101011010110111

Decimal equivalent= 87735

/*OUTPUT 2*/

Enter a binary number: 10xj777

Invalid binary number

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote