顺序栈的基本操作(C语言实现)

一 .栈的含义 以及 应用:
1.含义:栈(stack)是限定仅在表位进行插入删除操作的线性表

2.数据进出顺序为:先进后出,和弹夹压入的子弹一样,先压进去的最后才能射出;

3.应用场景:网页浏览时的后退 编辑软件中的“撤销”;

二.代码展示:

1.接口一览

void InitStack(SqStack *s);//顺序栈的初始化
void StackEmpty(SqStack S);//顺序栈判断栈是否为空
void StackLength(SqStack S);//求顺序栈长度
void ClearStack(SqStack *s);//清空顺序栈
void DestroyStack(SqStack*s);//销毁顺序栈
void Push(SqStack*s, SElemType e);//顺序栈入栈(压入子弹)
void Pop(SqStack*s);//顺序栈出栈(射出子弹)
void StackPrint(SqStack S);//栈的打印

2.具体代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int SElemType;

typedef struct
{
	SElemType * base;//栈底指针
	SElemType * top;//栈顶1指针
	int stacksize;//栈的最大容量
}SqStack;
void InitStack(SqStack *s)//初始化
{
	(*s).base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));
	if ((*s).base == NULL)
		exit(-1);
	(*s).top = (*s).base;
	(*s).stacksize = MAXSIZE;
	printf("初始化完成\n\n");
}
void StackEmpty(SqStack S)//检测是否为空
{
	printf("栈检测开始\n");
	if (!S.base)
	{
		printf("检测结果:栈不存在(可能没有初始化,也可能被销毁)\n");
	}
	else if (S.top==S.base)
	{
		printf("检测结果:栈为空\n");
	}
	else
	{
		printf("检测结果:栈不为空\n");
	}
}
void StackLength(SqStack S)//检测长度
{
	int Length=S.top - S.base;
	printf("栈的长度为:%d\n",Length);
}

void ClearStack(SqStack *s)//清理栈
{
	if ((*s).base)//保证栈已经初始化
	{
		(*s).top = (*s).base;//不用管之前存储在内存中的东西,只需要让S.top = S.base就行
		printf("栈清理完成\n");
	}
	else
	{
		printf("栈没有初始化\n");
	}
}
void DestroyStack(SqStack *s)//销毁栈
{
	if ((*s).base)
	{
		free((*s).base);//释放之前申请的空间
		(*s).stacksize = 0;
		(*s).base = (*s).top = NULL;
	}
}
void Push(SqStack *s, SElemType e)//元素入栈
{
	if ((*s).top - (*s).base == (*s).stacksize)//栈满条件
	{
		printf("栈满\n");
	}
	else
	{
		*((*s).top) = e;//*(S.top)表示截取到S.top指向的内容
		(*s).top++;
	}
}
void Pop(SqStack *s)//元素出栈
{
	if ((*s).top == (*s).base)
	{
		printf("栈已经为空,没有元素可以出栈\n");
	}
	(*s).top--;
	SElemType e = *(*s).top;
	printf("出栈元素为%d\n", e);
}
void StackPrint(SqStack S)//从栈顶开始打印,如果想从栈底打印,移动base指针即可
{
	S.top--;
	printf("栈中元素为:");
	while (S.top - S.base >= 0)
	{
		printf("%d  ", *(S.top));
		S.top--;
	}
	printf("\n\n");
}
void test()
{
	SqStack S;//完成这步之后,S里面的东西都是随机的
	InitStack(&S);

	Push(&S, 1);
	Push(&S, 2);
	Push(&S, 3);
	Push(&S, 4);
	Push(&S, 5);
	StackPrint(S);

	Pop(&S);
	Pop(&S);
	Pop(&S);
	StackPrint(S);

	StackLength(S);
	ClearStack(&S);
	StackEmpty(S);
	DestroyStack(&S);
	StackEmpty(S);


}
int main()
{
	test();
	return 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以实现顺序栈基本操作C语言代码如下: ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义的大小 typedef int ElemType; // 内元素类型 typedef struct { ElemType data[MAX_SIZE]; // 存储内元素的数组 int top; // 顶指针 } SqStack; // 定义顺序栈类型 void InitStack(SqStack *S); // 初始化 int StackEmpty(SqStack *S); // 判断是否为空 int StackFull(SqStack *S); // 判断是否已满 void Push(SqStack *S, ElemType x); // 入栈操作 ElemType Pop(SqStack *S); // 出操作 ElemType GetTop(SqStack *S); // 获取顶元素值 int main() { SqStack S; int i; ElemType x, top; InitStack(&S); // 初始化 // 生成元素 for (i = 1; i <= 10; i++) { x = i; Push(&S, x); // 入栈 } while (!StackEmpty(&S)) { top = GetTop(&S); // 获取顶元素值 printf("%d ", top); // 打印顶元素值 Pop(&S); // 出 } return 0; } // 初始化 void InitStack(SqStack *S) { S->top = -1; } // 判断是否为空 int StackEmpty(SqStack *S) { if (S->top == -1) { return 1; // 为空 } return 0; // 不为空 } // 判断是否已满 int StackFull(SqStack *S) { if (S->top == MAX_SIZE - 1) { return 1; // 已满 } return 0; // 未满 } // 入栈操作 void Push(SqStack *S, ElemType x) { if (StackFull(S)) { printf("Error: Stack Full.\n"); // 已满,无法入栈 return; } S->top++; // 顶指针加1 S->data[S->top] = x; // 新元素入栈 } // 出操作 ElemType Pop(SqStack *S) { ElemType x; if (StackEmpty(S)) { printf("Error: Stack Empty.\n"); // 为空,无法出 return -1; } x = S->data[S->top]; // 顶元素出 S->top--; // 顶指针减1 return x; // 返回顶元素值 } // 获取顶元素值 ElemType GetTop(SqStack *S) { if (StackEmpty(S)) { printf("Error: Stack Empty.\n"); // 为空,无法获取顶元素值 return -1; } return S->data[S->top]; // 返回顶元素值 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值