每日一题---day6

基础题:

1、两个栈实现一个队列

思路:

栈的特点:后进先出

队列的特点:先进先出

两个栈可将一个栈用于入数据,另一个用于出数据;

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stack>
#include<cassert>
template <class T>
class myqueue
{
public:
	void Push(T x)
	{
		s1.push(x);
	}
	void Pop()//删除头部数据
	{
	  assert(!Empty());
	  if(s2.empty())
	  {
            while(!s1.empty())
	    {
		  s2.push(s1.top());
		  s1.pop();
	    }
	  }
	  s2.pop();
	}
	T& Front()//取队首数据
	{
	    assert(!Empty());
		if(s2.empty())
		{
		  while(!s1.empty())
	          {
		    s2.push(s1.top());
		    s1.pop();
	           }
		}
		return s2.top();
	}
	T& Back() //取队尾数据
	{
               assert(!Empty());
		if(s1.empty())
		{
		    while(!s2.empty())
	            {
		      s1.push(s2.top());
		      s2.pop();
	            }
		}
		return s1.top();
	}
	bool Empty()
	{
		return s1.empty() && s2.empty();
	}
	size_t Size()
	{
		return s1.size() + s2.size();
	}
private:
	stack<T> s1; //入数据
	stack<T> s2; //出数据
};
测试:
void TestQueue()
{
	myqueue<int> q;
	q.Push(1);
	q.Push(2);
	q.Pop();
	q.Push(3);
	//cout<<q.Back()<<endl;
	q.Push(4);
	q.Push(5);
	cout<<q.Back()<<endl;
	while(!q.Empty())
	{
		cout<<q.Front()<<" ";
		q.Pop();
	}
	cout<<endl;
}

2、两个队列实现一个栈

思路:队列的特性:在队尾入数据,队头出数据

          栈的特性:在栈顶出入数据

         注意:两个队列中总有一个队列为空


代码:

#include<queue>
#include<cassert>
template <class T>
class mystack
{
public:
	void Push(T x)
	{
		if(!q1.empty())
		{
			q1.push(x);
		}
		else
		{
		  q2.push(x);
		}
	}
	void Pop()
	{
		assert(!Empty());
		queue<T>* p1 = &q1;
		queue<T>* p2 = &q2;
		if(q1.empty())
		{
			swap(p1,p2);
		}
		while(p1->size() > 1)
		{
            p2->push(p1->front());
			p1->pop();
		}
		p1->pop();
	}
	T Top()
	{
               assert(!Empty());
		queue<T>* p1 = &q1;
		queue<T>* p2 = &q2;
		if(q1.empty())
		{
			swap(p1,p2);
		}
		while(p1->size() > 1)
		{
                   p2->push(p1->front());
		   p1->pop();
		}
		T top = p1->front();
		p2->push(top);
		p1->pop();
		return top;
	}
	size_t Size()
	{
		return s1.size() + s2.size();
	}
	bool Empty()
	{
		return q1.empty() && q2.empty();
	}
private:
	queue<T> q1;
	queue<T> q2;
};
测试:
void TestStack()
{
	mystack<int> s;
	s.Push(1);
	//s.Pop ();
        s.Push(2);
	//s.Pop ();
	s.Push(3);
	s.Push(4);
	s.Pop ();
	while(!s.Empty())
	{
		cout<<s.Top()<<" ";
		s.Pop();
	}
	cout<<endl;


}

附加题:

替换字符串中的空格为$$$,要求时间复杂度为O(N)

例如:将“talk is cheap show me the code”替换为

“talk$$$is$$$cheap$$$show$$$me$$$the$$$code”.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值