栈的链式存储结构

栈的链式存储结构的实现

1)编写完成下列功能的函数:(1)初始化一个栈;(2)在已经初始化的基础上,创建一个包含 5 个不大于 100 的正整数值的栈(5 个值由计算机随机产生);(3)将一个数 x 插在栈顶(x 在程序运行时输入);( 4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)求栈中元素的个数;(6)输出从栈顶到栈底的所有元素。

#define MAXSIZE 100
typedef struct StackNode{
SElemType data;
struct StackNode *next;
} StackNode, *LinkStack;

链栈是动态的分配内存空间,不需要判断栈空和栈满。但删除时,要释放空间。
创建就是将元素一个一个插入栈中,求栈长就是遍历栈。

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct StackNode{
	int data;
	struct StackNode *next;
}  StackNode, *LinkStack;
 
void InitStack(LinkStack &S);
int CreateStack(LinkStack &S);
int Push(LinkStack &S,int x);
int Pop(LinkStack &S,int &x);
int StackLength(LinkStack S);
int PrintStack(LinkStack S);

void InitStack(LinkStack &S)
{//初始化
	S=NULL;
}
int CreateStack(LinkStack &S)
{//创建
	int i,a;
	printf("长度为:");
	scanf("%d",&a);
	srand((unsigned)time(NULL));
	for(i = 0;i < a;i++ )
	{
		LinkStack p=(LinkStack )malloc(sizeof(StackNode));      
		if (!p)  
			return ERROR; 
		p->data = rand() % 100 +1;
		p->next=S;
		S=p; 
	 }
	return OK;
 }
int Push(LinkStack &S,int x)
{//插入
	LinkStack p=(LinkStack )malloc(sizeof(StackNode));      
	if (!p)  
		return ERROR; 
	p->data = x;
	p->next=S;
	S=p; 
	return OK;
}
int Pop(LinkStack &S,int &x)
{//出栈
	LinkStack p = S;
	x = p->data;
	S = p->next ;
	free(p);//释放
	return OK;
}
int StackLength(LinkStack S)
{//栈长
	int n = 0;
	LinkStack p = S ;
	while(p != NULL)
	{
		n++;
		p = p->next ;
	}
	return n ;
}
int PrintStack(LinkStack S)
{//遍历
	LinkStack p = S ;
	while(p != NULL)
	{
		printf("%d ",p->data );
		p = p->next ;
	}
	return OK;
}
int main()
{
	int a,k,x,i,e;
	LinkStack S;
	for(k = 0;;k++)
	{
        printf("\n1.初始化一个链栈\n");
		printf("2.创建一个正整数的链栈\n");
		printf("3.插入某个元素到栈顶\n");
		printf("4.删除某个栈顶元素\n");
		printf("5.求链栈长\n");
		printf("6.遍历元素\n");
		printf("7.退出程序\n");
		printf("输入你的选择:\n");
		scanf("%d",&a);
		switch (a)
		{
		    case 1:
				InitStack(S);
				printf("创建成功!\n");
				break;
			case 2:
				CreateStack(S);
				PrintStack(S);
				break;
			case 3:
				printf("你想插入的数为:");
				scanf("%d",&x);
				Push(S,x);
				PrintStack(S);break;
			case 4:
				e = Pop(S,x);
				printf("删除栈顶元素为:%d\n",e);
				PrintStack(S);break;
			case 5:
				 i = StackLength(S);
				 printf("栈长为:%d",i);break;
			case 6:PrintStack(S);break;
			case 7:exit(0);
		}
	}
	return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值