顺序栈
用的是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;
}