《数据结构》链栈基本操作与实现

本文详细介绍了一种使用链表实现的栈结构,包括初始化、压栈、弹栈、获取栈顶元素、判断是否为空等核心操作,并提供了一个完整的C语言代码示例,用于演示链栈的创建和基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OVERFLOW -1

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int Status;
typedef int SElemType;

typedef struct Node{
	SElemType data;
	struct Node *next;
}SNode,*LinkStack;

//构造链栈
Status InitStack(LinkStack *S)
{
	*S=NULL;
	return OK;
}
//压栈
Status Push(LinkStack *S,SElemType e)
{
	//插入e作为栈顶元素
	SNode *p;
	p=(SNode*)malloc(sizeof(SNode));
	p->data=e;
	p->next=*S;
	*S=p;
	return OK;
}

//弹出
Status Pop(LinkStack *S,SElemType *e){
	//删除栈顶元素,用e返回其值
	SNode *p;
	if(*S==NULL)
		return ERROR;
	else{
		p=*S;
		*e=p->data;
		free(p);
		return OK;
	}
}
//求长度
int StackLength(LinkStack S){
	SNode *p;
	int count=0;
	p=S;
	while(p){
		p=p->next;
		count++;
	}
	return count;
}

//返回栈顶元素
Status GetTop(LinkStack S,SElemType *e){
	if(S==NULL)return ERROR;
	*e = S->data;
	return OK;
}

//遍历
Status PrintStack(LinkStack S){
	SNode *p;
	p=S;
	if(p->next==0)
		return ERROR;
	while(p){
		printf("%d\t",p->data);
		p=p->next;
	}
	return OK;
}

//判空
Status StackEmpty(LinkStack S){
	if(S->next==0)
		return OK;
	return ERROR;
}

//清空
Status ClearStack(LinkStack S){
	SNode *p,*q;
	p=S->next;
	S->next=NULL;
	while(p){
		q=p->next;
		free(p);
		p=q;
	}
	return OK;
}
# include "stdio.h"
# include "stdlib.h"
# include "LinkStack.h"

void main()
{

	LinkStack S;
	int choice;
	if(InitStack(&S)==OK)
		printf("success!\n");
	else
		printf("fail!\n");
	while(choice)
	{
		system("cls");
		printf("1.Push  2.Pop   3.StackLength  4.GetTop \n");
		printf("5.PrintLinkStack   6.StackEmpty   7.ClearStack \n");
		printf("--------------------0.Exit------------------\n");

		printf("enter the choice:");
		scanf("%d",&choice);

		switch(choice)
		{
		case 0:
			printf("byebye!\n");
			break;
		case 1:
			{
				SElemType e;
				int i;
				int n;
				printf("请输入你将要输入的数据个数n:");
				scanf("%d",&n);
				for(i=0;i<n;i++)
				{
					printf("enter the elem:");
					scanf("%d",&e);
					Push(&S,e);
				}
				break;
			}
		case 2:
			{
				SElemType e;
				int date;
				date=Pop(&S,&e);
				if(date>0)
					printf("The pop elem is : %d\n",e);
				else
					printf("The stack is empty!\n");
				break;
			}
		case 3:
			{
				printf("The length is %d.\n",StackLength(S));
				break;
			}
		case 4:
			{
				SElemType e;
				if(GetTop(S,&e)==ERROR)
					printf("fail!");
				else
					printf("The top elem is:%d.\n",e);
				break;
			}
		case 5:
			{
				if(PrintStack(S)==ERROR)
					printf("The stack is empty!\n");
				break;
			}
		case 6:
			{
				if(StackEmpty(S)==OK)
					printf("The satck is empty!\n");
				else
					printf("The stack isn't empty!\n");
				break;
			}
		case 7:
			{
				if(ClearStack(S)==OK)
					printf("The stack is clear!\n");
				else
					printf("The stack isn't clear!\n");
				break;
			}
		}
		system("pause");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值