解码器将堆栈实现为链接结构

时间:2013-11-20 02:50:06

标签: c++ linked-list stack structure decoder

我正在编写的这个程序将使用堆栈的特殊实现作为链接结构。我将使用堆栈解析和解码用户的编码消息输入。我编写的内容编译发现并运行而不会崩溃。程序要求用户解码字符串。但是,编码的消息不会被解码,并且屏幕上会打印出结果。我无法弄清楚为什么我的程序没有解码和打印用户的输入。任何帮助是极大的赞赏。感谢。

我的标题文件:

#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.

我的.cpp文件:

#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;
}

我的主要.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;
}

2 个答案:

答案 0 :(得分:1)

这行代码

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

当我为零时,可能会出现问题。

答案 1 :(得分:0)

保证每次尝试endMsg [-1],因为i = 0后紧接着是encMsg [i-1],因为&amp;&amp;在场。

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
    {