队列和栈
题目链接:栈和队列
题目描述:
队列和栈是两种重要的数据结构,它们具有 push k 和 pop 操作。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;
}