`
u010815305
  • 浏览: 30498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

两个栈实现队列

 
阅读更多
题目描述:

用两个栈来实现一个队列,完成队列的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>  
#include<stdbool.h> 

typedef struct Node
{
	int data;
	struct Node *pNext;
}Node,*pNode;

typedef struct Stack
{
	pNode pTop;
	pNode pBottom;
}Stack,*pStack;

/*创建一个空栈,并返回指向该栈的指针*/

pStack createStack()
{
	pStack ps=(pStack)malloc(sizeof(Stack));
	ps->pTop=(pNode)malloc(sizeof(Node));
	if(ps==NULL||ps->pTop==NULL)
		return NULL;
	else
	{
		ps->pBottom=ps->pTop;
		ps->pBottom->pNext=NULL;
	}
	return ps;
}
/*判断该栈是否为空 */
bool isEmpty(pStack ps)
{
	if(ps->pTop==ps->pBottom)
		return true;
	else
		return false;
}

/*向ps指针指向的栈中压入数据val*/
void  pushStack(pStack ps,int val)
{
	pNode pNew =(pNode)malloc(sizeof(Node));
	if(pNew==NULL)
		return ;
	else
	{
		pNew->data=val;
		pNew->pNext=ps->pTop;
		ps->pTop=pNew;
	} 
	return;
}
/*从栈中退出数据,并将数据的保存在pData指针指向的位置*/
bool popStack(pStack ps,int* pData)
{
	if(isEmpty(ps))
		return false;
	else
	{
		pNode p = ps->pTop;
		*pData=p->data;
		ps->pTop=p->pNext;
		free(p);
		p=NULL;
		return true;
	}
}

/*清空栈,即将其还原为空栈*/

void clearStack(pStack ps)
{
	if(isEmpty(ps))
		return;
	else
	{
		pNode p = ps->pTop;
		pNode r=NULL;
		while(p!=ps->pBottom)
		{
			r=p->pNext;
			free(p);
			p=r;
		}
		ps->pTop=ps->pBottom;
	}
}

/*用两个栈模拟入队*/
void enterQueue(pStack ps,int val)
{
	pushStack(ps,val);
}

/*用两个栈模拟出对*/
bool deleteQueue(pStack ps1,pStack ps2,int *pData)
{
	if(isEmpty(ps1)&&(isEmpty(ps2)))
		return false;
	if(!isEmpty(ps2))
		popStack(ps2,pData);
	else if(!isEmpty(ps1))
	{
		while(!isEmpty(ps1))
		{
			int ps1PopData;
			popStack(ps1,&ps1PopData);
			pushStack(ps2,ps1PopData); 
		}
		popStack(ps2,pData);
	}
	return true;
}
int main()
{
	int number;      //保存操纵的个数  
    int data;   //保存输入的要push的元素  
    int pData;  //保存pop出来的元素  
    char *push = "PUSH";  
    char *pop = "POP";  
    char input[5];  
    int data_pop;  
    
    //创建两个栈
	pStack ps1 = createStack();
	pStack ps2 = createStack();
	
	scanf("%d",&number);
	
	while(number-->0)
	{
		scanf("%s",input);
		if(strcmp(input,push)==0)
		{
			scanf("%d",&data);
			enterQueue(ps1,data); 
		}
		if(strcmp(input,pop)==0)
		{
			if(deleteQueue(ps1,ps2,&pData))
				printf("%d\n",pData);
			else
				printf("-1\n"); 
		}
	} 
	clearStack(ps1);  
    clearStack(ps2);  
    return 0; 
}

结果:

分享到:
评论

相关推荐

    用两个栈实现队列1

    标题 "用两个栈实现队列1" 描述的是一个编程问题,主要目标是利用两个栈来模拟一个队列的行为。队列是一种先进先出(FIFO,First In First Out)的数据结构,通常有两个主要操作:入队(在队尾添加元素)和出队(在...

    python 实现 用两个栈实现队列

    python 实现 用两个栈实现队列

    用两个栈实现队列.md

    用两个栈实现队列.md

    shushu1234#articles-backup#2018-04-13-剑指Offer-用两个栈实现队列1

    title: 剑指Offer-用两个栈实现队列subtitle: 用两个栈实现队列categories: 剑指Offer用两个栈实现队列题目描述用两个栈来实现一

    c++-剑指offer题解之用两个栈实现队列

    c++ c++_剑指offer题解之用两个栈实现队列

    python-剑指offer第5题用两个栈实现队列

    python python_剑指offer第5题用两个栈实现队列

    两个栈实现一个队列

    要使用两个栈实现队列,我们需要一个入队栈(pushStack)和一个出队栈(popStack)。入队操作(enqueue)相当于向pushStack中添加元素,而出队操作(dequeue)则涉及将pushStack中的元素转移到popStack,然后从pop...

    Veal98#CS-Wiki#232-用两个栈实现队列1

    232. 用两个栈实现队列232. 用栈实现队列题目描述解题思路/** Initialize your data structure here. *//** R

    ZhuoZhuoCrayon#CS-Notes#9. 用两个栈实现队列1

    9. 用两个栈实现队列题目链接牛客网题目描述用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。当元素要出栈时,需要先进入 out 栈,此时元素出栈

    bbkgl#notes#用两个栈实现队列1

    用两个栈实现队列思路很简单:入栈只入栈1出栈只从栈2出,出栈时如果栈2右元素则顶部元素出栈,否则让栈1元素全部压入到栈2,然后栈2最上面元素出栈代码如下:

    用两个栈实现一个队列的功能?要求给出算法和思路

    ### 使用两个栈实现队列功能 #### 背景与目的 在计算机科学领域中,数据结构是存储和组织数据的方式之一,对于提高程序效率至关重要。队列是一种先进先出(FIFO)的数据结构,而栈则是一种后进先出(LIFO)的数据...

    用两个栈实现队列(纯原创,亲测可行)

    队列的两种实现方式一种是数组一种是栈,此处介绍如何将用两个栈来实现一个队列

    C++利用两个栈实现队列的方法

    C++利用两个栈实现队列的方法 本文主要介绍了使用两个栈来实现队列的方法,该方法主要用于C++编程语言。队列是一种先进先出(FIFO)的数据结构,而栈是一种后进先出的数据结构。通过使用两个栈,我们可以模拟队列的...

    03-用两个栈实现一个队列.md

    在分析算法的时间复杂度时,我们发现如果用两个栈实现队列,add操作的时间复杂度为O(1),delete操作的时间复杂度可能为O(n),因为在某些情况下我们需要将stack1中的所有元素转移到stack2中。然而,在实际操作中,...

    如何使用两个栈实现队列Java

    这种实现方法虽然在pop操作时可能会有额外的时间开销(如果栈2为空,需要转移所有元素),但在某些情况下,如空间限制或特定应用场景下,使用两个栈实现队列可能比直接使用Java提供的Queue接口更具优势,因为它避免...

    剑指offer刷题记录之用两个栈实现队列

    用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 2. 解题思路 2.1 分析 栈:先进后出 队列:先进先出 要求用两个栈{stack1,stack2}实现一个队列,也就是说我们需要使用栈的push和pop...

    C++实现用栈实现队列的功能

    标题“C++实现用栈实现队列的功能”表明我们将使用C++编程语言,通过创建两个栈来实现队列的主要功能:入队(enqueue)和出队(dequeue)。这种方法的思路是,一个栈用于入队操作,另一个栈用于出队操作,以此来克服...

    C语言用两个栈实现一个队列的功能

    用量个栈实现一个队列,使其可以有进队和出队的操作。

Global site tag (gtag.js) - Google Analytics