顺序栈-严蔚敏教材-C语言实现

顺序栈

用的是C语言不是C++,编译器vs2019,出现的 scanf_s() 在vs需要,如果复制到其他地方可以改成 scanf()

严蔚敏教材-算法3.1-3.4

顺序栈的存储结构

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
#define ERROR -1
#define OK 1
#define SElemType int
#define Status int

typedef struct {
	SElemType* base;
	SElemType* top;
	int stacksize;
} SqStack;

算法3.1:顺序栈的初始化

//算法3.1:顺序栈的初始化
Status InitStack(SqStack* S) {//构造一个空栈 S
	S->base = (SqStack*)malloc(sizeof(SqStack) * MAXSIZE);	//为顺序栈动态分配数组空间
	if (!S->base) {
		printf("栈初始化失败\n");
		return ERROR;
	}
	
	S->top = S->base;										//top 指针初始为 base,空栈
	S->stacksize = MAXSIZE;									//stacksize 置位栈的最大容量 MAXSIZE
	
	return OK;
}

算法3.2:顺序栈的入栈

//算法3.2:顺序栈的入栈
Status Push(SqStack* S, SElemType e) {
	if (S->top - S->base == S->stacksize) {					//栈满
		printf("入栈失败\n");	
		return ERROR;
	}
	
	*S->top++ = e;											//元素 e 压入栈顶,栈顶指针加 1
	
	return OK;
}

算法3.3:顺序栈的出栈

//算法3.3:顺序栈的出栈
Status Pop(SqStack* S, SElemType* e) {
	if (S->top == S->base) {								//栈空
		printf("出栈失败\n");
		return ERROR;
	}
	
	S->top = S->top - 1;									//栈顶指针减 1,将栈顶元素赋给 e
	*e = *S->top;			//这里的e是指针
	
	return OK;
}

算法3.4:取顺序栈的栈顶元素

//算法3.4:取顺序栈的栈顶元素
SElemType GetTop(SqStack S) {
	if (S.base != S.top)									//栈非空
		return *(S.top - 1);								//返回栈顶元素的值,栈顶指针不变
	
	return ERROR;
}

顺序栈测试程序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
#define ERROR -1
#define OK 1
#define SElemType int
#define Status int

typedef struct {
	SElemType* base;
	SElemType* top;
	int stacksize;
} SqStack;

Status InitStack(SqStack* S);
Status Push(SqStack* S, SElemType e);
Status Pop(SqStack* S, SElemType* e);
SElemType GetTop(SqStack S);

int main(void) {
	SqStack S;
	int E, *e = &E;
	InitStack(&S);		//初始化栈

	//入栈
	printf("请输入栈内元素 *e:");
	while (scanf_s("%d",e) != NULL) {
		printf("请再次输入栈内元素 *e:");
		Push(&S, *e);
	}

	//取顺序栈的栈顶元素
	*e = GetTop(S);
	printf("栈顶元素为:%d\n", *e);

	//将栈内全部元素出栈
	printf("全部元素出栈为:");
	while (S.base != S.top) {
		Pop(&S, e);
		printf("%d ", *e);
	}
	printf("\n");

	system("pause");
	return EXIT_SUCCESS;
}

//算法3.1:顺序栈的初始化
Status InitStack(SqStack* S) {//构造一个空栈 S
	S->base = (SqStack*)malloc(sizeof(SqStack) * MAXSIZE);	//为顺序栈动态分配数组空间
	if (!S->base) {
		printf("栈初始化失败\n");
		return ERROR;
	}
	
	S->top = S->base;										//top 指针初始为 base,空栈
	S->stacksize = MAXSIZE;									//stacksize 置位栈的最大容量 MAXSIZE
	
	return OK;
}

//算法3.2:顺序栈的入栈
Status Push(SqStack* S, SElemType e) {
	if (S->top - S->base == S->stacksize) {					//栈满
		printf("入栈失败\n");	
		return ERROR;
	}
	
	*S->top++ = e;											//元素 e 压入栈顶,栈顶指针加 1
	
	return OK;
}

//算法3.3:顺序栈的出栈
Status Pop(SqStack* S, SElemType* e) {
	if (S->top == S->base) {								//栈空
		printf("出栈失败\n");
		return ERROR;
	}
	
	S->top = S->top - 1;									//栈顶指针减 1,将栈顶元素赋给 e
	*e = *S->top;			//这里的e是指针
	
	return OK;
}

//算法3.4:取顺序栈的栈顶元素
SElemType GetTop(SqStack S) {
	if (S.base != S.top)									//栈非空
		return *(S.top - 1);								//返回栈顶元素的值,栈顶指针不变
	
	return ERROR;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值