在线评判:创建一堆std :: stacks

时间:2014-06-08 14:05:53

标签: c++ memory-management

我遇到了这个问题并正在解决它。问题非常简单。您将获得PUSH和POP命令的输入集,您需要打印适当堆栈的输出。

Sample Input:
7
PUSH 1 100
PUSH 1 200
PUSH 2 300
PUSH 2 400
POP 2
POP 1
POP 2
Sample Output[Expected]:
400
200
300

为了解决这个问题,我提出了以下想法。但是,我的结果并没有像人们预期的那样出现。我得到了很多垃圾值。你能帮我解决这个问题吗?我已经使用Java解决了这个问题。但是法官没有接受Java代码。所以,必须用C ++编写代码。关于这里缺少什么的任何想法都是最受欢迎的。

#include<iostream>
#include<vector>
#include<stack>
#include<string>
#include<map>

int main()
{
    std::map<int,std::stack<int> > indexStackMap; // int->stack

    int noOfInstructions = 0;
    scanf( "%d", &noOfInstructions );

    for( int inx = 0; inx < noOfInstructions; ++inx )
    {
        char instruction[5];
        scanf("%s", &instruction );     

        int stackNumber = 0;
        scanf( "%d", &stackNumber );

        if( strcmp( instruction, "PUSH" ) == 0 )
        {            
            int stackValue = 0;
            scanf( "%d", &stackValue );

            std::map<int,std::stack<int> >::iterator intStackIter = indexStackMap.begin();

            if( indexStackMap.find( stackNumber ) == indexStackMap.end() )
            {
                // Element not in yet!.
                std::stack<int> *tempStack = new std::stack<int>();
                tempStack->push( stackValue );
                indexStackMap[ stackNumber ] = *tempStack;                
            }
            else
            {
                std::stack<int> & ref = intStackIter->second;
                ref.push( stackValue );
            }
        }
        else
        {
            std::map<int,std::stack<int> >::iterator intStackIter = indexStackMap.find( stackNumber );
            std::stack<int> & ref = intStackIter->second;
            ref.pop();
            printf( "%d\n", ref.top() );
        }
    }
    return  0;   
}

谢谢, 帕。

编辑:我的解决方案正常工作。但是从判断中抛出内存限制超出错误。 http://pastebin.com/hYuGgzp5

编辑:以下代码解决了此问题。

#include<iostream>
#include<vector>
#include<stack>
#include<string>
#include<map>

int main()
{
    std::map<int,std::stack<int> > indexStackMap; // int->stack

    int noOfInstructions = 0;
    scanf( "%d", &noOfInstructions );

    for( int inx = 0; inx < noOfInstructions; ++inx )
    {
        char instruction[5];
        scanf("%s", &instruction );     

        int stackNumber = 0;
        scanf( "%d", &stackNumber );

        if( strcmp( instruction, "PUSH" ) == 0 )
        {            
            int stackValue = 0;
            scanf( "%d", &stackValue );

            indexStackMap[stackNumber].push(stackValue);
        }
        else
        {
            std::map<int,std::stack<int> >::iterator intStackIter = indexStackMap.find( stackNumber );
            std::stack<int> & ref = intStackIter->second;
            printf( "%d\n", ref.top() );
            ref.pop();

        }
    }
    return  0;   
}

1 个答案:

答案 0 :(得分:1)

当弹出堆栈时,在查看stack::pop()的值之前,您正在调用top()。这需要反过来因为pop()从堆栈中删除了顶部元素。

由于(不必要的)new没有匹配delete,您也会发生内存泄漏。

顺便说一句,要推送一个新元素,你只需要:

indexStackMap[stackNumber].push(stackValue);

而不是整个if语句。如果需要,这将为地图添加一个新堆栈。