严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。
/*顺序栈*/
#include<cstdio>
#include<cstdlib>
#define SElemType int
#define Status int
#define STACK_INIT_SIZE 100 //初始空间分配量
#define STACKINCREMENT 10 //存储空间分配增量
//using namespace std;
//栈的结构
typedef struct {
SElemType* base; //栈底指针,在栈结构不存在(构造之前和销毁之后),base的值为NULL
SElemType* top; //栈顶指针,非空栈的栈顶指针始终在栈顶元素的的下一个位置上
int stacksize; //可存储的最大容量,即最多存储的元素个数
}SqStack;
栈的结构
Status InitStack(SqStack& S) {
S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base) {
printf("动态空间分配失败!\n");
exit(OVERFLOW);
}
S.top = S.base;//栈顶元素=栈底元素
S.stacksize = STACK_INIT_SIZE;//栈存储空间
printf("顺序栈初始化成功!\n");
return 0;
}
销毁栈
Status DestroyStack(SqStack& S) {
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
printf("此栈销毁成功!\n");
return 0;
}
取栈的栈顶元素并用e返回该值
Status GetTop(SqStack S, SElemType& e) {
if (S.top == S.base) printf("这是一个空栈!\n"); return 0;
e = *(S.top - 1);
printf("该栈的栈顶元素是:%d", e);
return 0;
}
插入元素e为新的栈顶元素(入栈操作)
Status Push(SqStack& S, SElemType e) {
if (S.top - S.base > S.stacksize) {//栈满追加存储空间
S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S.base) printf("动态存储空间分配失败!\n"); exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;//更新栈的最大容量
}
*S.top++ = e;
printf("插入新栈顶元素成功!\n");
return 0;
}
删除栈顶元素并用e返回该值
Status Pop(SqStack& S, SElemType e) {
if (S.top = S.base) printf("该栈为空栈!\n"); exit(OVERFLOW);//判断栈是否非空
e = *--S.top;
printf("删除栈顶元素成功!\n");
return 0;
}
查找栈中的元素个数
Status StackLength(SqStack& S) {
int count = S.top - S.base;
return count;
}
判断栈是否非空
bool StackEmpty(SqStack& S) {
if (S.base == S.top) {
printf("此栈为空!\n");
return true;
}
else {
printf("此栈不为空!\n");
return false;
}
}
置空栈
Status ClearStack(SqStack& S) {
S.top = S.base;
printf("置空操作成功!\n");
return 0;
}
栈遍历输出(先进后出)
Status StackTraverse(SqStack& S) {
printf("开始遍历!\n");
for (SElemType* i = S.base; i < S.top; i++) {
printf("%d", *i);
}
printf("\n");
return 1;
}
int main() {
/*此处省略10000字*/
}
main交给各位写了,我实现了没有问题的,有问题的请联系我。
学艺不精,若有错误还请多多指教,谢谢。
p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()
更多内容请移步公众号 手撕算法。谢谢
算法爱好者协会群:940100543,加入学习讨论。
所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
提取码:1234
推荐新手使用dev cpp 链接:https://pan.baidu.com/s /1XZp_8lVE7X6tMLmvXRbYhw
提取码:1234