问题 D: 模拟栈的数字游戏

题目描述

根据输入的数列,经过一系列的入栈、出栈、清空栈操作之后,得到一个输出序列。

输入

先输入数列的长度n。
然后输入n个数字,数字均为整数。

输出

根据输入数列中各个数字的值,作如下处理。
1)如果输入的数字大于0,则入栈;
2)如果输入的数字等于0,则清空栈;
3)如果输入数字小于0,则出栈。其中,负号后接的数字表示要出栈的数字的个数。如果数字超过了栈中数字的实际个数,则不作处理。
最后的输出占2行。
1)第一行是出栈的序列;
2)第二行是最后栈中剩下的序列。

样例输入 Copy

10
1 2 3 -2 4 5 -5 -1 6 7

样例输出 Copy

3 2 5
1 4 6 7

直接用简化的顺序栈即可实现

代码如下:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 200
typedef struct S{//定义结构体 
	int data[MAXSIZE];
	int top;
}Stack;
void Init(Stack *L)//初始化栈 
{
	L->top =-1;
}
void Push(Stack *L,char x)//进栈函数 
{
	if(L->top >=MAXSIZE){
		return ;
	}
	L->top ++;
	L->data [L->top ]=x;
}
bool is_Empty(Stack L)//判断栈是否为空 
{
	if(L.top ==-1){
		return true;
	} 
	return false;
} 
int Pop(Stack *L)//出栈并返回栈顶元素 
{
	int e;
	if(L->top ==-1){
		return ;
	}
	e=L->data[L->top ] ;
	L->top --;
	return e;
}
void clear(Stack *L){
	L->top=-1;
}

int main()
{
	int n,i;//n表示数列的长度
	Stack L;
	Init(&L);
	int e,a;
	scanf("%d",&n);
	while(n--){
		scanf("%d",&a);//输入一个数字a!!!!总是忘记取地址符 
		if(a>0){
			if(L.top <=MAXSIZE){//若栈已经满了呢 
				Push(&L,a);
			}
		} 
		else if(a==0){
			clear(&L);
		}
		else if(a<0){
			if(-a<=L.top+1){
				for(i=0;i<-a-1;i++){
					e=Pop(&L);
					printf("%d ",e);
				}
				e=Pop(&L);
				printf("%d ",e);
			} 
			else {
				;
			}
		}
	} 
	Stack S=L;
	printf("\n"); 
	for(i=0;i<L.top ;i++){
		printf("%d ",L.data[i]);
	}
	printf("%d",L.data[i]);
	return 0;
}

 中途出现的问题:

1.函数名未统一 ,小tips:在调用函数时,可以观察是否出现红色小字提示(形参的类型),若未出现,可能出现了函数名不统一
2.结构指针用->,普通结构体变量用.引用结构体成员
3.函数声明,和函数首部都应指明形参类型
4.输入时忘记取地址符 
5.中间不知道为什么2死活不出栈,后来发现了原因:出栈时的循环条件应该为 i<-a-1而不是i<a-1,因为a为一负值,则无法正常将后面的元素进行出栈
6.判断是否进行出栈的条件应该为-a<=L.top+1 (L.top其实相当于数组下标,加上1才表示是第几个元素)

除此外还有一个问题:若是栈已经满了怎么办呢?不过题目似乎不需要考虑这个问题

另外,清空栈与销毁栈是不同的,清空栈只要再将栈顶指针指向头节点(这个似乎不能叫做头节点?此处假设为链栈)即可,而销毁还要将原来每个节点中的元素free掉

ps.每天最开心的事情就是AC了吧哈哈哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值