面试题7-用两个栈实现队列

题目:

用两个栈实现一个队列,主要实现两个函数 appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。

细节看剑指offer,比较简单,直接上代码

#include <iostream>
using namespace std;

struct Stack
{
	int data[10];
	int length;
};
//栈的初始化操作
void InitStack(Stack &s)
{
	s.length = 0;
}

//压栈操作
void Push(Stack &s, int valule)
{
	if(s.length == 10)
	{
		return ; //栈满,失败
	}
	s.data[s.length++] = valule;
}

//弹栈操作
int Pop(Stack &s)
{
	if(s.length<=0)
	{
		return -1;//栈空,删除失败
	}

	return s.data[--s.length];
}
class CQueue
{
public:
	CQueue();
	void appendTail(int value);
	int deletHead();
private:
	Stack stack1;
	Stack stack2;
};
CQueue::CQueue()
{
	InitStack(stack1);
	InitStack(stack2);
}

void CQueue::appendTail(int value)
{
	cout<<"====="<<endl;
	if(stack1.length != 10)
	{
		Push(stack1,value);
	}
}

int CQueue::deletHead()
{
	if(stack1.length <=0 && stack2.length<=0)
	{
		return -1; //队列为空,不能删除
	}
	else if(stack2.length >0)
	{
		return Pop(stack2);
	}
	else
	{
		while(stack1.length >0)
		{
			Push(stack2,Pop(stack1));
		}

		return Pop(stack2);
	}
}
int main()
{
	CQueue cqueue;
	cqueue.appendTail(1);
	cqueue.appendTail(2);
	cqueue.appendTail(3);
	cout<<cqueue.deletHead()<<endl;
	cout<<cqueue.deletHead()<<endl;
	cqueue.appendTail(5);
	cout<<cqueue.deletHead()<<endl;
	cout<<cqueue.deletHead()<<endl;
	return 0;
}
本题引申:用两个队列实现栈的操作,主要实现压栈和弹栈,也是直接上代码:

#include <iostream>
using namespace std;
 
//实现循环队列
struct Queue
{
	int a[10];
	int rear;  //队列的尾,指向将要插入元素的地址
	int front; //队列的头,指向队列的第一个元素
};

//初始化队列
void InitQueue(Queue &queue)
{
	queue.rear = 0;
	queue.front = 0;
}

//往队列中插入一个元素
void InsertQueue(Queue &queue, int value)
{
	//判断是否慢
	if((queue.rear+1)%10 == queue.front)
	{
		return ; //队列已满
	}

	queue.a[queue.rear] = value;
	queue.rear = (queue.rear+1)%10;
}

//从队列中删除一个元素
int DeleteQueue(Queue &queue)
{
	//判断是否为空
	if(queue.rear == queue.front)
	{
		return -1; //队列为空,不存在元素
	}
	int temp = queue.a[queue.front];
	queue.front = (queue.front+1)%10;
	return temp;
}

//栈的定义
class Stack
{
public:
	Stack();
	void Push(int value);
	int Pop();
private:
	Queue queue1;
	Queue queue2;
};

//构造操作
Stack::Stack()
{
	InitQueue(queue1);
	InitQueue(queue2);
}

//压栈操作
void Stack::Push(int value)
{
	if(queue2.rear==queue2.front)
	{
		InsertQueue(queue1,value);
	}
	else
	{
		InsertQueue(queue2,value);
	}
}

//弹栈操作
int Stack::Pop()
{
	if(queue1.rear!=queue1.front)
	{//队列1不为空,将队列1中的n-1个元素放到队列2中
		while((queue1.front+1)%10 != queue1.rear)
		{
			InsertQueue(queue2,DeleteQueue(queue1));
		}
		return DeleteQueue(queue1);
	}
	else if(queue2.rear != queue2.front)
	{
		while((queue2.front+1)%10 != queue2.rear)
		{
			InsertQueue(queue1,DeleteQueue(queue2));
		}
		return DeleteQueue(queue2);
	}
	else
	{
		return -1; //栈为空,无法删除
	}
}
int main()
{
	Stack stack;
	stack.Push(1);
	stack.Push(2);
	stack.Push(3);
	cout<<stack.Pop()<<endl;
	cout<<stack.Pop()<<endl;
	stack.Push(4);
	stack.Push(5);
	cout<<stack.Pop()<<endl;
	cout<<stack.Pop()<<endl;
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值