【问题描述】
假设给定的整数栈初始状态为空,栈的最大容量为100。从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1、0和-1)为入栈元素;0表示出栈操作;-1表示操作结束。
【输入形式】
从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔。
【输出形式】
在一行上按照操作的顺序输出出栈元素序列,以一个空格分隔各元素,最后一个元素后也要有一个空格。如果栈状态为空时进行出栈操作,或栈满时进行入栈操作,则输出字符串“error”,并且字符串后也要有一空格。所有操作都执行完后,栈也有可能不为空。
【样例输入】
1 3 1 5 1 7 0 0 1 8 0 1 12 1 13 0 0 0 0 1 90 1 89 0 -1
【样例输出】
7 5 8 13 12 3 error 89
#include <stdio.h>
#include <malloc.h>
typedef struct node{
int data;
struct node *link;
}STNode,*STLink;//栈
typedef struct Node{
int sign;
int data;
struct Node *link;
}LNode,*LinkList;//因为是先全部输入再输出,所以需要把输入的数据全部存起来。
//这里采用链表存数据是因为不知道数据个数,而题目已经说明数据最多为100,故也可以用数组。同理栈也可以使用数组。
LinkList INSERT1(LinkList list)//插入出栈的链接点
{
LinkList p,r;
p=(LinkList)malloc(sizeof(LNode));
p->sign=0;
p->link=NULL;
if(list==NULL)
{
list=p;
}
else
{
r=list;
while(r->link!=NULL)
{
r=r->link;
}
r->link=p;
}
return list;
}
LinkList INSERT2(LinkList list,int m)
{
LinkList r;
list=INSERT1(list);//先插入出栈的链接点
r=list;
while(r->link!=NULL)
{
r=r->link;//找到尾节点
}
r->sign=1;//将此链接点修改为入栈链接点
r->data=m;
return list;
}
#define LEN sizeof(STNode)
int POPLINK(STLink *top)//出栈
{
int item;
STLink p;
p=(*top);
item=p->data;
(*top)=(*top)->link;
free(p);
return item;
}
STLink PUSHLINK(STLink top,int item)//入栈
{
STLink p;
p=(STLink)malloc(LEN);
p->data=item;
p->link=top;
top=p;
return top;
}
int main()
{
STLink top=NULL;
int n,m;
LinkList list=NULL,p,r;
while(1)//输入
{
scanf("%d",&n);
if(n==-1)
{
break;
}
else if(n==0)
{
list=INSERT1(list);
}
else if(n==1)
{
scanf("%d",&m);
list=INSERT2(list,m);
}
}
while(list!=NULL)
{//依次根据list链表对top栈进行相应的操作
if(list->sign==1)
{
top=PUSHLINK(top,list->data);
}
else
{
if(top==NULL)
{
printf("error ");
}
else
{
printf("%d ",POPLINK(&top));
}
}
p=list;
list=list->link;
free(p);
}
return 0;
}
本题是一道基础题,笔者均采用链表来存储显得代码量较多,但相比静态数组却节省了系统空间(虽然也没省多少)。