1、stack.h
#pragma once
#include<stdio.h>
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 3 //定义栈的初始化大小
#define STACKINCREMENT 1 //定义栈每次内存增加的大小
typedef int Status; //处理状态,TRUE 1,FALSE 0
typedef int ElemType; //定义元素的类型
typedef struct {
ElemType *base;//栈底指针
ElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间
}SqStack,* SqStack_p;
//初始化一个栈空间
Status InitStack(SqStack &s);
//入栈
Status Push(SqStack &s,ElemType e);
//出栈
Status Pop(SqStack &s, ElemType &e);
//获得栈顶元素
Status GetTop(SqStack s, ElemType &e);
//判断栈是否为空
Status StackEmpty(SqStack s);
2、stack.cpp
#include<stdio.h>
#include<stdlib.h>
#include"Stack.h"
Status InitStack(SqStack &s) {
s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //为栈分配内存
if (!s.base) exit(0);
s.top = s.base; //两指针指向同一地址
s.stacksize = STACK_INIT_SIZE; //为栈容量赋值
return TRUE;
}
Status Push(SqStack &s,ElemType e) {
//当栈空间不足时
if ((s.top - s.base) >= s.stacksize) { //进入该语句的条件是,top指针已越界
//realloc(要改变内存大小的指针名,新的大小)
s.base = (ElemType *)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(ElemType));
if (!s.base) exit(0);
s.top = s.base + s.stacksize; //由于top指针已越界,而有重新分配的内存空间,所以要top也指向新的内存地址
s.stacksize += STACKINCREMENT; //为栈容量赋值
}
*(s.top++) = e; //先参与赋值,再指针再加一
return TRUE;
}
Status Pop(SqStack &s, ElemType &e) {
if (s.top > s.base) {
e = *(--s.top); //先参与赋值,再指针再减一
return TRUE;
}
return FALSE;
}
Status GetTop(SqStack s, ElemType &e) {
if (s.top > s.base) {
e = *(s.top - 1); //不需要top--
return TRUE;
}
return FALSE;
}
Status StackEmpty(SqStack s) {
if (s.top == s.base) {
return TRUE;
}
return FALSE;
}
3、TestMain.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Stack.h"
int main() {
SqStack s;
InitStack(s);
printf("栈为空%d\n",StackEmpty(s));
int data;
printf("输入一组将要入栈的值,形如 1 2 3 4 5 a(以任意字母结尾)\n");
while (scanf_s("%d", &data)!=0) {
Push(s,data);
}
GetTop(s, data);
printf("Top = %d\n", data);
while (s.top-s.base > 0) {
Pop(s, data);
printf("Pop = %d\t", data);
}
return 0;
}
4、运行结果