0

「インフィックス」表記を「プレフィックス」に変換し、独自の「スタックとキュー」の実現を使用するプログラム (C++) を作成します。

しかし、私は次のことを取得します:"Critical error detected c0000374"そして"Free Heap block modified at ... after it was freed"最後の文字列void main() { /*...*/ system("pause"); }または最後の文字列void toPrefix();

誰かが私を助けて、私の間違いを指摘してもらえますか?

ソース.cpp:

#include "iostream"
#include "fstream"
#include "string"
#include "Stack.h"
#include "Queue.h"

void toPrefix(const std::string& first)
{
    int length = first.length();
    char test = NULL, operand = NULL;
    char *ptr = &test, *op_ptr = &operand;
    Queue<char> List;
    std::string Output;
    Stack<char> OpStack;
    for (int i = length - 1; i >= 0; i--) List.push(first[i]); //
    while (List.getsize() != 0)
    {
        List.pop(ptr);
        if (test >= 48 && test <= 57) //is it number?
        {
            Output.insert(Output.begin(), test);
        }
        if (test == '*' || test == '/' || test == '-' || test == '+')
        {
            OpStack.push(test);
        }
        if (test == ')')
        {
            OpStack.push(test);
        }
        if (test == '(')
        {
            OpStack.pop(op_ptr);
            while (operand != ')')
            {
                Output.insert(Output.begin(), operand);
                OpStack.pop(op_ptr);
            }
        }
    }
}

void main()
{
    const std::string& first = "9-(2+2)";
    toPrefix(first);
    system("pause");
}

Queue.h:

#include<iostream>

template <typename T>
class Queue
{
private:
    struct queue_element
    {
        T value;
        queue_element *next;
    };

    queue_element *first;
    queue_element *last;
    int size;

public:
    Queue()
    {
        first = new(queue_element);
        last = first;
        first->value = -1;
        first->next = 0;
        size = 0;
    }
    Queue(T x)
    {
        first = new(queue_element);
        last = first;
        first->value = x;
        first->next = 0;
        size = 1;
    }

    int getsize()
    {
        return size;
    }

    void push(T value)
    {
        if (size == 0)
        {
            size++;
            last = first;
            first->value = value;
            first->next = 0;
        }
        else
        {
            size++;
            queue_element *temp = new(queue_element);
            temp->next = 0;
            temp->value = value;
            last->next = temp;
            last = temp;
        }
    }

    void pop(T* ret)
    {
        if (size == 0)
        {
            std::cout << "Queue is empty!" << std::endl;
            return;
        }
        queue_element *temp = first;
        *ret = first->value;
        first = first->next;
        size--;
    }

    void peek(T *ret)
    {
        if (size == 0)
        {
            std::cout << "Queue is empty!" << std::endl;
            return;
        }
        *ret = first->value;
    }
};

Stack.h

#include <iostream>

template <typename T>
class Stack
{
private:
    struct stack_element
    {
        T value;
        stack_element *next;
    };
    stack_element *first;
    stack_element *last;
    int size;

public:
    Stack()
    {
        last = new(stack_element);
        first = last;
        last->value = -1;
        last->next = first;
        size = 0;
    }
    Stack(T x)
    {
        last = new(stack_element);
        first = last;
        last->value = x;
        last->next = 0;
        size = 1;
    }

    int getsize()
    {
        return size;
    }

    void push(T value)
    {
        if (size == 0)
        {
            size++;
            last->value = value;
            last->next = first;
        }
        else
        {
            size++;
            stack_element *temp = new(stack_element);
            temp->next = last;
            temp->value = value;
            last = temp;
        }
    }

    void pop(T* ret)
    {
        if (size == 0)
        {
            std::cout << "Stack is empty!" << std::endl;
            return;
        }
        stack_element *temp = last;
        *ret = last->value;
        last = last->next;
        delete temp;
        size--;
    }

    void peek(T *ret)
    {
        if (size == 0)
        {
            std::cout << "Stack is empty!" << std::endl;
            return;
        }
        *ret = first->value;
    }
};
4

1 に答える 1

0

Stackうーん...問題はあなたのクラスにあると思います。

渡す文字列toPrefix()"9-(2+2)"

したがって、Stack<char> OpStackで定義された you の操作toPrefix()は (よく理解している場合)

  1. デフォルト (引数なし) コンストラクターによる構築

  2. push()に対応して-

  3. pop()対応して od(

  4. push()に対応して+

  5. push()に対応して)

さて、その中で何が起こっているのか見てみましょう

1) デフォルトコンストラクタによる構築後

我々は持っています

1a)size == 0

1b) firstlastfirst->nextおよびlast->next同じ割り当てられたメモリ領域を指している

1c)first->value == last->value == (char)-1

push()2) (with -)への最初の呼び出しの後

我々は持っています

2a)size == 1

2b) firstlastfirst->nextおよびlast->next同じ割り当てられたメモリ領域を指している

2c)first->value == last->value == '-'

3) への最初の呼び出しの後pop()

我々は持っています

3a)size == 0

3b) firstlastfirst->nextおよびlast->next同じ DELETED メモリ領域を指している

3c)first->value == last->value == '-'

4) 2 回目の呼び出しpush()(で+)

4a)sizeインクリメント

4b) DELETED 領域に( ) と書かれているlast->value = value;

4c) DELETED 領域に再度書き込まれる ( )last->next = first;

これで問題を説明できると思います。

ps: Rambo Ramon と Sam Varshavchik からの「デバッガーを使用する」という提案は良い提案です (IMHO)

ps2: 下手な英語でごめんなさい

于 2016-05-10T17:48:34.317 に答える