设为首页 加入收藏

TOP

栈和队列常见问题及其算法和c++实现
2015-11-21 00:55:12 来源: 作者: 【 】 浏览:1
Tags:队列 常见问题 及其 算法 实现
1.实现一个栈,要求实现push,pop,Min(返回最小值的操作)的时间复杂度为O(1)
算法思想:需要设计一个辅助栈,用来存储当前栈中元素的最小值。额外需要注意push操作,第一个元素不用比较,自动成为最小值入栈,其他元素每次都要和栈顶元素进行比较,小的入栈。?
#include
#include ? ? ?//直接用 系统中的栈,不需要自己实现
using namespace std;
template
class Stack
{
public:
void push(const T& x)
{
_stack.push(x);
if (_minstack.empty())?
{
_minstack.push(x);
}
else
{
if (x < _minstack.top())
{
_minstack.push(x);
}
else
{
_minstack.push(_minstack.top());
}
}
}
void pop()
{
_stack.pop();
_minstack.pop();
}
T Retmin()
{
return _minstack.top();
}
private:
stack _stack;
stack _minstack;
};
void test()
{
Stack s;
int ret;
s.push(3);
s.push(2);
s.push(5);
s.push(1);
s.push(7);
?
s.pop();
s.pop();
ret = s.Retmin();
cout << "最小值是:" << ret << endl;
}
?
int main()
{
test();
return 0;
}
2.元素出栈入栈顺序的合法性检查
算法思想:用for循环将数组1中的元素入栈,每入栈一个与数组2中当前元素进行进行比较,如果相同就出栈,数组2中下一个元素作为当前元素。如果循环结束,而栈中还有元素,就说明数组2不是pop序列。
#include
#include
using namespace std;
bool InvalidCheck(int* stack_in, int* stack_out, int len1, int len2)
{
stack s;
if (len1 != len2)
{
return false;
}
int i = 0, j = 0;
for (i = 0, j = 0; i < len1; i++)
{
s.push(stack_in[i]);
while (s.size()>0 && s.top() == stack_out[j])
{
s.pop();
j++;
}
}
if (s.size() > 0)
return false;
else
return true;
}
int main()
{
int stack_in[] = { 1, 2, 3, 4, 5 };
int stack_out[] = { 4, 5, 1, 2, 3 };
int len1 = sizeof(stack_in) / sizeof(stack_in[0]);
int len2 = sizeof(stack_out) / sizeof(stack_out[0]);
bool ret = InvalidCheck(stack_in, stack_out, len1, len2);
if (ret)
{
cout << "出栈顺序合法!" << endl;
}
else
{
cout << "出栈顺序不合法!" << endl;
}
return 0;
}
?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇[LeetCode] Search a 2D Matrix II 下一篇c++:实现一个栈,包括入栈、出栈..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: