堆栈中的内存错误

时间:2013-12-06 20:07:53

标签: c++ memory stack

我正在编写一个程序来解决这个问题:

  

库存储存容器与各种N的货物。所有   容器以N堆栈形式写入。在每个堆栈中可以是容器   与任何物种的货物(堆栈最初可能是空的)。

     

叉车可以将任何顶部集装箱堆放在上面   任何堆栈。你必须把所有容器都装上了产品   第一种堆栈中的第一种,第二种类型 - 第二种堆栈,   等

     

程序应该打印叉车或消息的动作序列   说明问题没有解决方案。

     

输入格式

     

第一行输入包含单个正整数N,但不包含   超过500。接下来的N行首先描述容器的堆栈   由ki记录 - 堆栈中的容器数量,然后是ki   属性 - 从底部到堆栈中的容器中的货物类型   起来在每个堆栈的开头不超过500个容器(   运输过程中的容器可能会破坏这种限制)。产量   数据格式程序应打印卡车的描述   动作:对于每个动作类型两个数字 - 从中​​获取   放置的容器堆栈和堆栈。 (注意尽量减少金额   卡车运营不是必需的。 )如果没有解决方案,你   需要显示一个数字0。如果容器最初   正确放入桩中,输出不需要任何东西。

示例:

输入:

3
4 1 2 3 2
0
0

输出:

1 2
1 3
1 2

所以,我写了一个程序。你可以看到下面的代码:

#include <iostream>
using namespace std;
// Здесь, короче, стек.
struct Node{
    int data;
    Node *next;
};
Node* push(Node *start, int d){
    Node *a = new Node;
    a -> data = d;
    a -> next = start;
    return a;
}
Node* pop(Node *s, int &d){
    d = (s -> data);
    Node *a = s -> next;
    delete s;
    return a;
}
void move(Node **stack, int from, int to, int save, int *size, int *number){
    int k = 0;
    while(size[to] != number[to]){
        stack[from] = pop(stack[from], k);
        if(k - 1 == to){
            stack[to] = push(stack[to], k);
            size[to]++;
            cout << from + 1 << " " << to + 1 << endl;
        }
        else{
            stack[save] = push(stack[save], k);
            size[save]++;
            cout << from + 1 << " " << save + 1 << endl;
        }
        size[from]--;
    }
    if(save > to){
        while(size[save] != number[save]){
            stack[save] = pop(stack[save], k);
            stack[from] = push(stack[from], k);
            size[save]--;
            size[from]++;
            cout << save + 1 << " " << from + 1 << endl;
        }
    }
    else{
        while(size[save] != 0){
            stack[save] = pop(stack[save], k);
            stack[from] = push(stack[from], k);
            size[save]--;
            size[from]++;
            cout << save + 1 << " " << from + 1 << endl;
        }
    }

}

void to_one(Node **stack, int to, int m, int *size){
    int k = 0;
    for(int i = to + 1; i < m; i++){
        while(size[i] != 0){
            stack[i] = pop(stack[i], k);
            stack[to] = push(stack[i], k);
            size[to]++;
            size[i]--;
            cout << i + 1 << " " << to + 1 << endl;
        }

    }

}

int main(){
    int n = 0;
    int k = 0;
    cin >> n;
    Node **stack = new Node*[n]; // наши полки
    int *size = new int[n]; // количество элементов на каждой полке изначально
    int *number = new int[n]; // количество элементов соответствующего типа
    for(int i = 0; i < n; i++) number[i] = 0;
    for(int i = 0; i < n; i++){
        cin >> size[i];
        for(int j = 0; j < size[i]; j++){
                cin >> k;
                number[k - 1]++;
                stack[i] = push(stack[i], k);
        } // формируем наши полки
    }
    int from = 0;
    int m = n; // вспомогательная переменная количества неотсортированных полок
    //сперва все перенесем в одну полку (первую)
    to_one(stack, from, m, size);
    int save = 1; // вспомогательная
    //Теперь восстановим последнюю стопку, а вспомогательной будет вторая.
    int to = m - 1;
    move(stack, from, to, save, size, number);
    //Теперь наша готовая последняя стопка станет резервной навсегда.
    save = to;
    //А теперь отдельно рассмотрим полки между последней и первой, повторив цикл выше.
    m--;
    for(int i = m; i > from; i--){
        to = i - 1;
        to_one(stack, from, i, size);
        move(stack, from, to, save, size, number);
    }
    delete []number;
    delete []size;

    return 0;
}

我试着调试它,这就是我得到的。 我的意见是:

4
4 1 2 3 4
1 3
3 2 1 4
3 2 1

程序在此输出后崩溃:

2 1
3 1
3 1
3 1
4 1
4 1
1 2

截图: enter image description here

我不知道为什么会收到此错误。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

问题在于

stack[to] = push(stack[i], k);

应该是

stack[to] = push(stack[to], k);

感谢Joe Z。

相关问题