您的位置:首页 > 职场人生

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

2014-10-11 10:09 120 查看
题目:

用两个栈实现一个队列,主要实现两个函数 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息