队列和栈(C语言)

队列和栈

题目链接:栈和队列

题目描述:

       队列和栈是两种重要的数据结构,它们具有 push kpop 操作。push k 是将数字 k 加入到队列或栈中,pop 则是从队列和栈取一个数出来。队列和栈的区别在于取数的位置是不同的

       队列是先进先出的:把队列看成横向的一个通道,则 push k 是将 k 放到队列的最右边,而 pop 则是从队列的最左边取出一个数。

       栈是后进先出的:把栈也看成横向的一个通道,则 push k 是将 k 放到栈的最右边,而 pop 也是从栈的最右边取出一个数。

假设队列和栈当前从左至右都含有 1 和 2 两个数,则执行 push 5 和 pop 操作示例图如下:

                                     push 5           pop

                       队列 1 2 -------> 1 2 5 ------> 2 5

                                  push 5          pop

                       栈 1 2 -------> 1 2 5 ------> 1 2

现在,假设队列和栈都是空的。给定一系列 push k 和pop 操作之后,输出队列和栈中存的数字。若队列或栈已经空了,仍然接收到 pop 操作,则输出error。

输入描述:

第一行为 m,表示有 m 组测试输入,m<100。
每组第一行为 n,表示下列有 n 行 push k 或 pop 操作。(n<150)
接下来 n 行,每行是 push k 或者 pop,其中 k 是一个整数。
(输入保证同时在队列或栈中的数不会超过100个)

输出描述:

对每组测试数据输出两行,正常情况下,第一行是队列中从左到右存的数字,第二行是栈中从左到右存的数字。若操作过程中队列或栈已空仍然收到pop,则输出error。输出应该共2*m行。

输入样例:

2
4
push 1
push 3
pop
push 5
1
pop

输出样例:

3 5
1 5
error
error

样例说明:

一共输入两组,

第一组有四个操作

  • push 1

Stack[]={1}

Queue[]={1}

  • push 3

Stack[]={1,3}

Queue[]={1,3}

  • pop

Stack[]={1}

Queue[]={3}

  • push 5

Stack[]={1,5}

Queue[]={3,5}

第二组有一个操作

  • pop

因为栈和队列此时都为空,所以输出“error”。

思路:

这道题主要考察栈和队列的基本用法。

:这是一种后进先出的数据结构。只允许在数组的一端进行删除元素和添加元素。

例如:栈中有元素 1 2 3 4 5(5为栈顶)。如果依次进行出栈操作,输出的元素为 5 4 3 2 1

要实现这样的数据结构需要定义一个数组(Stack[n])还需要一个指向栈顶的指针(top)

出栈操作:top–;

进栈操作:Stack[top++]=num;

队列:这是一种先进先出的数据结构。只允许在数组的一端进行删除元素另一端添加元素。

要实现这样的数据结构需要定义一个数组(Queue[n])还需要两个指针一个指向对头的指针(head)和指向队尾的指针(tail)

例如队列中的元素Queue[]={1,2,3,4,5},

如果执行入队操作(Queue[tail++]=6)

则队列中的元素为Queue[]={1,2,3,4,5,6}

如果执行出队操作(head++)

则队列中的元素为Queue[]={2,3,4,5,6}

代码:

#include<stdio.h>
#include<string.h>

int main()
{
	//建立一个栈 
	int Stack[200];  
	int top; 
	
	//建立一个队列 
	int Queue[200];  
	int head;
	int tail;
	
	int m;
	scanf("%d",&m);
	
	while(m--)
	{
		int n;
		int num;        //用于存储 "push" 的数字 
		char str[10];   //用于存储字符串"push"和"pop" 
		
		
		int flag1=1;     //flag1用于判断队列是否为空,默认flag1=1,不为空 	
		int flag2=1;     //flag2用于判断栈是否为空,默认flag2=1,不为空 
			
		//清空队列和栈里的元素 
		top=0;
		head=0;
		tail=0;
		
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			scanf("%s",str);  //输入"push"和"pop" 
			
			//如果输入的是"push" 
			if(strcmp(str,"push")==0)
			{
				scanf("%d",&num);
				
				Stack[top++]=num;     //进栈 
				Queue[tail++]=num;    //存入队列 
			}
			
			//如果输入的是"pop" 
			if(strcmp(str,"pop")==0)
			{
				//判断队列是否为空,如果为空将标志位 flag1 置为 0 
				if(head>=tail)
					flag1=0;
				
				//判断栈是否为空,如果为空将标志位 flag2 置为 0 
				if(top<=0)
					flag2=0;
					
				//如果队列不为空,则将队头的元素出队列 
				if(!(head>=tail))
					head++;
				
				//如果栈不为空,则将栈顶的元素出栈 
				if(!(top<=0))	
					top--;
			}
		}
		
		//如果队列为空则输出"error",否则输出队列里的元素 
		if(flag1==0)
			printf("error\n");
		else
		{
			for(int i=head;i<tail;i++)
				printf("%d ",Queue[i]);
			printf("\n"); 
		}
		
		//如果栈为空则输出"error",否则输出栈里的元素 
		if(flag2==0)
			printf("error\n");
		else
		{
			for(int j=0;j<top;j++)
				printf("%d ",Stack[j]);
			printf("\n");
		}		
	} 	
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值