北航第四次作业——栈操作(栈-基本题)

该程序实现了一个整数栈,根据输入的栈操作序列(入栈、出栈)来输出出栈元素。使用链表存储栈操作,遇到0表示出栈,1表示入栈并读入整数。如果栈空时出栈或栈满时入栈,会输出错误信息。最后按照操作顺序输出出栈序列。
摘要由CSDN通过智能技术生成

【问题描述】

假设给定的整数栈初始状态为空,栈的最大容量为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;
}

本题是一道基础题,笔者均采用链表来存储显得代码量较多,但相比静态数组却节省了系统空间(虽然也没省多少)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值