题目描述
根据输入的数列,经过一系列的入栈、出栈、清空栈操作之后,得到一个输出序列。
输入
先输入数列的长度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了吧哈哈哈