我遇到了这个问题并正在解决它。问题非常简单。您将获得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;
}
答案 0 :(得分:1)
当弹出堆栈时,在查看stack::pop()
的值之前,您正在调用top()
。这需要反过来因为pop()
从堆栈中删除了顶部元素。
由于(不必要的)new
没有匹配delete
,您也会发生内存泄漏。
顺便说一句,要推送一个新元素,你只需要:
indexStackMap[stackNumber].push(stackValue);
而不是整个if
语句。如果需要,这将为地图添加一个新堆栈。