Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279048
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-08-28 19:09:34

编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构(如数组)。

该栈支持如下操作:push, pop, peek,和isEmpty

如果可以支持两个栈,我们可以每一次遍历栈1,将最小的元素放入栈2,把栈3作为搜索时的缓冲区

但是这里只能使用一个额外栈,那是不是就没有办法了呢?不是的

我们不需要反复搜索栈1来依次获得最小值,假设栈s是要排序的栈,栈r是已排序的栈

s = [5,10,7]

r = [12,8 ,3,1]

栈顶元素5在r中的正确位置应该是3的上面,我们可以先弹出5,反正5是无论如何都要从s压入r的,然后将12和8压入栈s,然后将5压入栈r

注意这是12和8没有在r中了,但是只要我们不改变它们在s中的顺序,重复上面的步骤,12和8一次从s弹出再压入r还是在5的上面,r依然是有序的。

时间复杂度为O(n^2),空间复杂度O(n)。
 vector<int> twoStacksSort(vector<int> numbers) {
        // write code here
   
         vector<int> vec;
while(!numbers.empty())
{
int temp=numbers.front();
numbers.erase(numbers.begin());
int count=0;
while(vec.size()!=0 && vec.front()>temp)
{
int t=vec.front();
vec.erase(vec.begin());
numbers.insert(numbers.begin(),t);
count++;
}
vec.insert(vec.begin(),temp);
while(count--)
{
int t=numbers.front();
numbers.erase(numbers.begin());
vec.insert(vec.begin(),t);
}
}
return vec;
    }

阅读(1038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~