动态栈与静态栈

栈使用到top(栈顶指针) 和 base(栈底指针)的为《动态栈》,需要两个指针->下方有完整代码

《静态栈》只使用到一个top(栈顶"伪"指针)->下方有完整代码

栈的基本操作(基于动态栈)

1:初始化

status InitStack(Sqstack& S)//栈的初始化
{
	S.base = (SElemType*)malloc(sizeof(SElemType[MAX]));
	if (!S.base)
	{
		return  OVERFLOW;
	}
	S.top = S.base;
	S.Stacksize = MAX;
	return ok;
}

2:入栈

status push(Sqstack& S, SElemType e)//入栈操作
{

	if (S.top - S.base == MAX)
	{
		return 0;
	}
	*S.top++ = e;
	return ok;

}

3:出栈

status pop(Sqstack& S, SElemType &e)//出栈操作
{
	if (S.top == S.base)
	{
		return 0;
	}
	e=*--S.top;
	return ok;
}

4:取栈顶

SElemType GetTop(Sqstack S)//取栈顶操作
{
	if (S.top != S.base)
	{
		return *--S.top;
	}
}

5:输出栈的所有内容

void  StackEmpty(Sqstack S)//判断栈是否为空
{
	if (S.top != S.base)
	{
		printf("非空栈");
	}
	else
	{
		printf("空栈");
	}
}

void StackTraverse(Sqstack S)//输出所有栈的内容
{
	SElemType* p;
	p = S.top;
	while (p != S.base)
	{
		printf("%d\n", *--p);
	}
}

--------------------------------------------------以上为基本操作的展示-------------------------------------------------

使用的编译器是vs2019,源文件后缀为.cpp。

动态栈的完整代码:

#define _CRT_SECURE_NO_WARNINGS//栈
#include <stdio.h>
#include <malloc.h>

//全局定义特殊变量
#define ok 1
#define OVERFLOW 0
#define MAX 50

//转定义区域
typedef int SElemType;
typedef int status;


typedef struct//定义栈
{
	SElemType* top;
	SElemType* base;
	int Stacksize;

}Sqstack;

status InitStack(Sqstack& S)//栈的初始化
{
	S.base = (SElemType*)malloc(sizeof(SElemType[MAX]));
	if (!S.base)
	{
		return  OVERFLOW;
	}
	S.top = S.base;
	S.Stacksize = MAX;
	return ok;
}

void Packfun1(Sqstack& S)
{
	int i;
	i=InitStack(S);
	if (i = 1)
	{
		printf("初始化成功!");
	}
	else
	{
		printf("初始化失败!");
	}
}

status push(Sqstack& S, SElemType e)//入栈操作
{

	if (S.top - S.base == MAX)
	{
		return 0;
	}
	*S.top++ = e;
	return ok;

}

void Packfun2(Sqstack& S)
{
	int i;
	SElemType e;
	printf("请输入要入栈的值:");
	scanf("%d",&e);
	i=push(S,e);
	if (i = 1)
	{
		printf("入栈成功!");
	}
	else
	{
		printf("入栈失败!");
	}
}
status pop(Sqstack& S, SElemType &e)//出栈操作
{
	if (S.top == S.base)
	{
		return 0;
	}
	e=*--S.top;
	return ok;
}

void Packfun3(Sqstack& S)
{
	int i;
	SElemType e=0;
	i=pop(S, e);
	if (i == 1)
	{
		printf("%d已经出栈", e);
	}
	else
	{
		printf("该栈无元素");
	}
}

SElemType GetTop(Sqstack S)//取栈顶操作
{
	if (S.top != S.base)
	{
		return *--S.top;
	}
}

void Packfun4(Sqstack& S)
{
	int i;
	i=GetTop(S);
	printf("现在栈顶的值为:%d",i);
}

void  StackEmpty(Sqstack S)//判断栈是否为空
{
	if (S.top != S.base)
	{
		printf("非空栈");
	}
	else
	{
		printf("空栈");
	}
}

void StackTraverse(Sqstack S)//输出所有栈的内容
{
	SElemType* p;
	p = S.top;
	while (p != S.base)
	{
		printf("%d\n", *--p);
	}
}

void StackLength(Sqstack S)//输出栈的长度
{
	int i=0;
	SElemType* p;
	p = S.top;
	while (p != S.base)
	{
		--p;
		i++;
	}
	printf("该栈的长度为%d", i);
}



void Clearstack(Sqstack& S)//清空栈
{
	S.top = S.base;
	printf("栈已清空!");
}

int main()
{
	int a, f = 0, i = 0;
	Sqstack S;
	
	while (1)
	{
		printf("\n");
		printf("================================\n");
		printf("|        动态栈的操作系统      |\n");
		printf("================================\n");
		printf("|        1.初始化动态栈        |\n");
		printf("|        2.入栈                |\n");
		printf("|        3.出栈                |\n");
		printf("|        4.取栈顶值            |\n");
		printf("|        5.遍历(显示栈的内容) |\n");
		printf("|        6.求栈的长度          |\n");
		printf("|        7.判断栈的状况        |\n");
		printf("|        8.清空栈的内容        |\n");
		printf("|        0.退出动态栈操作系统  |\n");
		printf("================================\n");
		printf("请选择功能(0-10):");
	mark:scanf("%d", &a);
		switch (a)
		{
		case 0:f = 1; break;
		case 1: Packfun1(S); break;
		case 2: Packfun2(S); break;
		case 3: Packfun3(S); break;
		case 4: Packfun4(S); break;
		case 5: StackTraverse(S); break;
		case 6: StackLength(S); break;
		case 7: StackEmpty(S); break;
		case 8: Clearstack(S); break;
		default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
		}
		if (f == 1)
		{
			printf("已经退出系统");
			break;//该break是为了退出while的无限“菜单”循环
		}
	}
}

静态栈的完整代码:ps(静态栈的top只是作为一个"数组[ top ]"的索引)

#define _CRT_SECURE_NO_WARNINGS//栈
#include <stdio.h>
#include <malloc.h>

//全局定义特殊变量
#define ok 1
#define OVERFLOW 0
#define MAX 50

//转定义区域
typedef int SElemType;
typedef int status;

//函数声明


typedef struct//定义栈
{
	SElemType data[MAX];
	int top;

}Sqstack;

status InitStack(Sqstack& S)//栈的初始化
{
	S.top = -1;
	return ok;
}

void Packfun1(Sqstack& S)
{
	int i;
	i = InitStack(S);
	if (i = 1)
	{
		printf("初始化成功!");
	}
	else
	{
		printf("初始化失败!");
	}
}

status push(Sqstack& S, SElemType e)//入栈操作
{

	if (S.top == MAX)
	{
		return 0;
	}
	S.data[++S.top]= e;
	return ok;

}

void Packfun2(Sqstack& S)
{
	int i;
	SElemType e;
	printf("请输入要入栈的值:");
	scanf("%d", &e);
	i = push(S, e);
	if (i = 1)
	{
		printf("入栈成功!");
	}
	else
	{
		printf("入栈失败!");
	}
}
status pop(Sqstack& S, SElemType& e)//出栈操作
{
	if (S.top == -1)
	{
		return 0;
	}
	e = S.data[S.top--];
	return ok;
}

void Packfun3(Sqstack& S)
{
	int i;
	SElemType e = 0;
	i = pop(S, e);
	if (i == 1)
	{
		printf("%d已经出栈", e);
	}
	else
	{
		printf("该栈无元素");
	}
}

SElemType GetTop(Sqstack S)//取栈顶操作
{
	if (S.top != MAX)
	{
		return S.data[S.top];
	}
}

void Packfun4(Sqstack& S)
{
	int i;
	i = GetTop(S);
	printf("现在栈顶的值为:%d", i);
}

void  StackEmpty(Sqstack S)//判断栈是否为空
{
	if (S.top != -1)
	{
		printf("非空栈");
	}
	else
	{
		printf("空栈");
	}
}

void StackTraverse(Sqstack S)//输出栈的内容
{
	StackEmpty(S);
	while (S.top != -1)
	{
		printf("%d\n", S.data[S.top--]);
	}
}

void StackLength(Sqstack S)//输出栈的长度
{
	int i = 0;
	while (S.top != -1)
	{
		--S.top;
		i++;
	}
	printf("该栈的长度为%d", i);
}

void Clearstack(Sqstack& S)//清空栈
{
	S.top = -1;
	printf("栈已清空!");
}

int main()
{
	int a, f = 0, i = 0;
	Sqstack S;

	while (1)
	{
		printf("\n");
		printf("================================\n");
		printf("|        动态栈的操作系统      |\n");
		printf("================================\n");
		printf("|        1.初始化动态栈        |\n");
		printf("|        2.入栈                |\n");
		printf("|        3.出栈                |\n");
		printf("|        4.取栈顶值            |\n");
		printf("|        5.遍历(显示栈的内容) |\n");
		printf("|        6.求栈的长度          |\n");
		printf("|        7.判断栈的状况        |\n");
		printf("|        8.清空栈的内容        |\n");
		printf("|        0.退出动态栈操作系统  |\n");
		printf("================================\n");
		printf("请选择功能(0-10):");
	mark:scanf("%d", &a);
		switch (a)
		{
		case 0:f = 1; break;
		case 1: Packfun1(S); break;
		case 2: Packfun2(S); break;
		case 3: Packfun3(S); break;
		case 4: Packfun4(S); break;
		case 5: StackTraverse(S); break;
		case 6: StackLength(S); break;
		case 7: StackEmpty(S); break;
		case 8: Clearstack(S); break;
		default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
		}
		if (f == 1)
		{
			printf("已经退出系统");
			break;//该break是为了退出while的无限“菜单”循环
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值