0

This program I am writing will use a special implementation of a stack as a linked structure. An encoded message input my the user will be parsed and decoded using the stack. What I have written compiles find and runs without crashing. The program asks the user for the string to be decoded. However, the encoded message is not decoded with result printed on the screen. I can't figure out why my program isn't decoding and printing the user's input. Any help is greatly appreciated. Thanks.

My header file :

#ifndef DECODER_H
#define DECODER_H

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

// ---------------------------
// Structure which will serve
// as the link on the stack.
// ---------------------------
struct StackNode {
    char ch;
    StackNode* next;
};

// -------------------------------
// Class which will contains the
// functions for appropriate use
// of the stack.
// -------------------------------
class Decoder
{
private:
    StackNode* top;

public:
    Decoder();
    ~Decoder(); 
    int EmptyStack();
    int FullStack();
    void Push(char ch);
    char Pop();
    void Decode(char *encMsg, char *decMsg);
};

#ifndef FALSE
#define FALSE (0)
#endif

#ifndef TRUE
#define TRUE (!FALSE)
#endif

#endif // End of stack header.

My .cpp file:

#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include "Decoder.h"

// ------------------------------
// Function: Decoder()
//
// Purpose: Class constructor.
// ------------------------------
Decoder::Decoder()
{
    top = NULL;
}

// ------------------------------
// Function: Decoder()
//
// Purpose: Class destructor.
// ------------------------------
Decoder::~Decoder()
{
    // TODO
    // Destroy anything remaining in the stack
}

// -----------------------------------
// FullStack()
// 
// Return TRUE if the stack is full.
// -----------------------------------
int Decoder::FullStack()
{
    return TRUE;
}

// -----------------------------------
// EmptyStack()
//
// Return TRUE if the stack is empty
// -----------------------------------
int Decoder::EmptyStack()
{
    return (top == NULL);
}

// ------------------------------------------------
// Function: void Push(char ch)
//
// Purpose: Dynamically creates a structure of type
// StackNode (see Decoder.h), stores the character
// in the structure and pushes the structure onto
// the stack.
// ------------------------------------------------
void Decoder::Push(char ch)
{
    // Make a new node whose reference is
    // the existing list 
    StackNode* newNode = new (StackNode);
    newNode->ch = ch;
    // newNode->next = NULL;
    if (top == NULL)
        top = newNode; // top points to new node
    else
    {
        newNode->next = top;
        top = newNode;
    }
}

// --------------------------------------------------
// Function: char Pop()
//
// Purpose: Remove (pop) the top node from the stack,
// copy the character, from this node, delete and
// return the character.
// --------------------------------------------------
char Decoder::Pop()
{
    StackNode* temp;
    char ch;

    if (!EmptyStack())
    {
        ch = top->ch;
        temp = top;
        top = top->next;
        delete(temp);
        return ch;
    }
    else {
        cout << "Warning: Overuse of Pop()" << endl;
        return '\0';
    }
}

// ----------------------------------------------------
// Function: void Decode(char* encMsg, char* decMsg)
//
// Purpose: Parse and decode the message stored in the
// character array encMsg using the stack functions
// and return the decoded message in the char array
// decMsg.
// ----------------------------------------------------
void Decoder::Decode(char* encMsg, char* decMsg)
{
    int StackCount = 0;
    char num[2] = " ";
    for (int i = 0; i < strlen(encMsg); i++)
    {
        // check whether 1 is an even number of input
        if ((encMsg[i] == '1') && (encMsg[i-1] != '2')) // every other index will be a command number
        {
            Push(encMsg[i+1]);
            StackCount++;
        }
        if (encMsg[i] == '2' && ((encMsg[i+1] >= '0') && (encMsg[i+1 ] <= '9'))) // every other index will be a command number
        {
            num[0] = encMsg[i+1];
            // pop as many as the argument states to pop
            for (int j = 0; j < atoi(num); j++)
            {
                Pop();
                StackCount--;
            }
        }
    }
    //cout << StackCount << endl;
    // Place the remaining characters from the stack into decMsg
    int i;
    for (i = 0; i < StackCount; i++)
    {
        decMsg[i] = Pop();
    }
    decMsg[i] = '\0';
    return;
}

My Main .cpp:

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

int main (void)
{
    char quit[] = "QUIT";
    char en[2048];
    char dec[512];
    Decoder d;

    do {
        cout << "\nEnter a message to be decoded" << endl;
        cin.getline(en, 1024);
        d.Decode(en, dec);
        cout << dec << endl;
    } while (strcmp(en,quit) != 0);

    return 0;
}
andrewsi
  • 10,807
  • 132
  • 35
  • 51
Larry T.
  • 35
  • 2
  • 9
  • This code looks like a Data Structure practice. One advice for you is to split your decoder from the stack. A object with mixed code on storage(stack) and functions(decoding) will add complexity and difficult for you to debug. – Archer Nov 20 '13 at 02:58
  • From the code, I can see the correctness of the execution is highly correlated with your input. I strongly recommend you to use your debugger and go through the execution, find out why the result is not expected. – Archer Nov 20 '13 at 03:07

2 Answers2

1

This line of code

if ((encMsg[i] == '1') && (encMsg[i-1] != '2'))

Maybe a problem there when i is zero.

Deidrei
  • 2,125
  • 1
  • 14
  • 14
0

It is guaranteed to try endMsg[-1] every time since i=0 is followed immediately by encMsg[i-1] which is always checked since && is present.

for (int i = 0; i < strlen(encMsg); i++)
{
    // check whether 1 is an even number of input
    if ((encMsg[i] == '1') && (encMsg[i-1] != '2')) // every other index will be a command number
    {
xd6_
  • 483
  • 4
  • 9