c++ - 将堆栈实现为链接结构的解码器

标签 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;
}

最佳答案

这行代码

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

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

关于c++ - 将堆栈实现为链接结构的解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20086392/

相关文章:

c++ - 为什么不能将平凡的派生类视为聚合类型?

c++ - 我如何使用 C++ 中的代码从字面上打开文件

c++ - 将行附加到 Armadillo .mat 文件

c - 错误: expected expression before 'book'

c - C 中的标签类型

c++ - 简单的无锁堆栈 c++11

c - 如何比较链表中的条目?

c++ - 直接用变量设置指针意味着什么?

java - 从java中的链表保存数据?

c - 需要帮助弄清楚为什么 LinkList 程序给出垃圾值或内存访问错误