【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码

三 栈

1.定义

只允许在一端进行插入操作或删除的线性表。

  • 重要术语

    • 栈顶:允许 插入和删除的一端。
    • 栈底:不允许 插入删除的一端。
    • 空栈:不含任何元素的空表。
  • 出栈顺序(卡特兰数):

    n个不同元素进栈,出栈元素不同排列的个数:

    1 n + 1 C 2 n n \frac{1}{n+1} \quad C_{2n}^n n+11C2nn

2.基本操作

#include<stdio.h>

#define MaxSize 10
#define ElemType int

//定义
typedef struct {
	ElemType data[MaxSize];//静态数组存放栈中元素
	int top;//栈顶指针
}SqStack;

//初始化
void InitStack(SqStack& S)
{
	S.top = -1;//初始化栈顶指针
}

//判断栈空
bool StackEmpty(SqStack S)
{
	if (S.top == -1)
		return true;
	else
		return false;
}

//新元素入栈
bool Push(SqStack& S, ElemType x)
{
	//栈满报错
	if (S.top == MaxSize - 1)
	{
		return false;
	}

	S.data[++S.top] = x;//新元素入栈
	return true;
}

//出栈操作
bool Pop(SqStack& S, ElemType& x)
{
	//栈空,报错
	if (S.top == -1)return false;

	x = S.data[S.top--];//出栈
	return true;
}

//读栈顶元素
bool GetTop(SqStack S, ElemType& x)
{
	if (S.top == -1)return false;
	//记录栈顶元素
	x = S.data[S.top];
	return true;
}

int main()
{
	SqStack S;
	InitStack(S);

	for (int i = 0; i < 10; i++)
	{
		printf("入栈元素:%d  ", i);
		Push(S, i);
	}
	printf("入栈结束!\n\n");

	int x;
	for (int i = 0; i < 5; i++)
	{
		Pop(S, x);
		printf("出栈元素:%d  ", x);
	}
	printf("出栈结束!\n\n");

	if (!StackEmpty(S))
	{
		GetTop(S, x);
		printf("栈顶元素:%d\n", x);
	}
	return 0;
}

3.共享栈

  • 定义

    两个栈共享一片内存区域。

    一个栈将数组开头作为栈顶,另一个将数组末尾作为栈顶。

    typedef struct{
        ElemType data[MaxSize];//静态数组存放栈中元素
        int top0;//0号栈栈顶指针
        int top1;//1号栈栈顶指针
    }
    
    //初始化
    void InitStack(ShStack &S){
        S.top0=-1;//初始化栈顶指针
        S.top1=MaxSize;
    }
    
  • 栈满条件

    top0+1==top1;

4.链栈

  • 定义

    采用链式存储的栈。

  • 优点

    便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。

  • 实现

    用单链表实现,且规定所有操作只能在单链表表头实现。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ElemType int

typedef struct Linknode {
	ElemType data;//数据域
	struct Linknode* next;//指针域
}LSnode,*LiStack;//栈类型定义

//初始化
//不带头结点
bool InitList(LiStack& S)
{
	S = NULL;
	return true;
}

//判空
bool isEmpty(LiStack &S)
{
	if (S == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//随机创建栈
bool Stack_Creat(LiStack& S)
{
	LSnode* t;
	int n = 10;
	srand(time(0));
	while (n--)
	{
		t = (LSnode*)malloc(sizeof(LSnode));
		t->data = rand() % 100 + 1;
		if (isEmpty(S))
		{
			t->next = NULL;
			S = t;//t作为头结点
		}
		else
		{
			t->next = S;
			S = t;
		}
	}
	return true;
}

//入栈
//插入数据为新栈顶元素
bool Stack_Push(LiStack& S, ElemType x)
{
	LSnode* t;
	t = (LSnode*)malloc(sizeof(LSnode));
	t->data = x;
	t->next = S;
	S = t;
	return true;
}

//出栈
bool Stack_Pop(LiStack& S, ElemType& x)
{
	x = S->data;
	S = S->next;
	return true;
}

//读栈顶元素
bool Stack_Top(LiStack& S, ElemType& x)
{
	x = S->data;
	return true;
}

void Stack_Print(LiStack& S)
{
	LiStack t = S;
	while (t->next != NULL)
	{
		printf("%d,", t->data);
		t = t->next;
	}
	printf("%d\n", t->data);
}

int main()
{
	LiStack S;
	InitList(S);

	printf("创建栈:\n");
	Stack_Creat(S);
	Stack_Print(S);
	printf("\n");

	int x;
	printf("请输入要添加的元素:");
	scanf_s("%d", &x);
	Stack_Push(S, x);
	Stack_Print(S);
	printf("\n");

	int y;
	Stack_Pop(S, y);
	printf("出栈元素:%d\n", y); 
	Stack_Print(S);
	printf("\n");

	int z;
	Stack_Top(S, z);
	printf("栈顶元素:%d\n", z);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值