题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。
队列中的元素为int类型。
/*
输入:
每个输入文件包含一个测试样例。
对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数。
接下来的n行,每行输入一个队列操作:
1. PUSH X 向队列中push一个整数x(x>=0)
2. POP 从队列中pop一个数。
输出:
对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。
样例输入:
3
PUSH 10
POP
POP
样例输出:
10
-1
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node{
int data;
struct Node *pNext;
};
struct Stack{
Node *pTop;
Node *pButtom;
};
//功能:创建一个空栈
Stack *createStack(){
Stack *s=(Stack *)malloc(sizeof(struct Stack));
s->pTop=(Node *)malloc(sizeof(struct Node));
if(s==NULL||s->pTop==NULL){
exit(EXIT_FAILURE);
}
s->pButtom=s->pTop;
s->pButtom->pNext=NULL;
return s;
}
//功能:检测一个栈是否为空
bool isEmpty(Stack *pS){
if(pS->pTop==pS->pButtom){
return true;
}
return false;
}
//功能:进栈
void push_stack(Stack *pS1,int data){
if(pS1==NULL){
return;
}
Node* newNode=(Node *)malloc(sizeof(Node));
if(newNode==NULL){
exit(EXIT_FAILURE);
}
newNode->data=data;
newNode->pNext=pS1->pTop;
pS1->pTop=newNode;
return;
}
//进队列
void enterQueue(Stack *pS1,int data){
//将数据压入到第一个栈中
push_stack(pS1,data);
}
//出栈,并将数据保存到pData中
bool pop_stack(Stack *pS,int *pData){
if(isEmpty(pS)){
return false;
}
//第一步:先将栈顶的元素取出。
Node *pNode=pS->pTop;
*pData=pNode->data;
//第二步:改变栈顶指针到其下一个元素的位置。
pS->pTop=pNode->pNext;
//第三步:将该结点所占有的空间销毁。
free(pNode);
pNode=NULL;
return true;
}
//出队列
//用两个队列来模拟出队列
bool outQueue(Stack *pS1,Stack *pS2,int *pData){
if(isEmpty(pS1)&&isEmpty(pS2)){
return false;
}
//第二个栈不为空时,直接输出这个栈的顶端元素即可。
if(!isEmpty(pS2)){
pop_stack(pS2,pData);
return true;
}
else{//如果第二个栈为空,则将第一个栈的所有元素放到第一个栈啦。
if(!isEmpty(pS1)){
//先将第一个栈的元素出栈,即为pTempData;
//再将元素进栈到第二个栈
while(!isEmpty(pS1)){
int pTempData;
pop_stack(pS1,&pTempData);
push_stack(pS2,pTempData);
}
pop_stack(pS2,pData);
return true;
}
}
return false;
}
int main(void){
int n;
while(scanf("%d",&n)!=EOF&&n>0){
//先创建两个空栈
Stack *pS1=createStack();
Stack *pS2=createStack();
char push[]="PUSH";
char pop[]="POP";
char input[5];//用来接收输入的字符,到底是PUSH 还是POP
int data;//用来保存要进队列的数。
int pData;//用来保存POP出来的数据。
for(int i=0;i<n;i++){
scanf("%s",input);
//完成push操作
if(strcmp(input,push)==0){
scanf("%d",&data);
//进队列就是先进入到pS1的栈中
enterQueue(pS1,data);
}
else if(strcmp(input,pop)==0){
//完成pop操作
if(outQueue(pS1,pS2,&pData)) {
printf("%d ",pData);
}
else{
printf("-1\n");
}
}
else{
printf("输入错误\n");
}
}
}
return 0;
}
此题的思路比较简单,细节问题还是有很多需要注意的。