我的问题是,对stack的使用,和类模板的使用。请高人帮我看看下面代码实现有什么问题?
#include <iostream>
#include <stack>
using namespace std;
template <typename T>
class StackWithMin
{
public:
void push(T elem);
void pop();
T top();
T min();
private:
stack<T> dataStack;
stack<T> minStack;
};
template <typename T>
void StackWithMin<T>::push(T elem)
{
dataStack.push(elem);
if (minStack.empty() && minStack.top() > elem)
{
minStack.push(elem);
}
}
template <typename T>
void StackWithMin<T>::pop()
{
if (dataStack.empty())
{
return;
}
if (dataStack.top() == minStack.top())
{
minStack.pop();
}
dataStack.pop();
}
template <typename T>
T StackWithMin<T>::top()
{
if (dataStack.empty())
{
return false;
}
return dataStack.top();
}
template <typename T>
T StackWithMin<T>::min()
{
if (minStack.empty())
{
return false;
}
return minStack.top();
}
int main(int argc, char const *argv[])
{
StackWithMin<int> ss;
ss.push(4);
ss.push(9);
ss.push(1);
ss.push(11);
ss.push(6);
cout << "min:" << ss.min() << endl;
cout << "top:" << ss.top() << endl;
ss.pop();
cout << "min:" << ss.min() << endl;
cout << "top:" << ss.top() << endl;
return 0;
}
这个函数的条件判断中
minStack.empty() && minStack.top() > elem
两个条件运算有问题,因为&&
运算符在计算了第一个条件为true
后,程序还会去计算第二个条件,而这里程序第一次运行minStack.empty()
为true
,这样运算minStack.top()
会导致Invalid read
即segmentation fault (core dumped)
. 楼主可以用valgrind测试一下就能知道程序非法访问了数据.