严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。
/*链栈*/
#include<cstdio>
#include<cstdlib>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define SElenType int
#define Status int
typedef struct LStack {
SElenType data;
struct LStack* next;
}LStack,*LStackList;
栈的初始化
Status InitStack(LStackList& S) {
S = new LStack;
S->next = NULL;
return 0;
}
创建栈
Status Creat(LStackList &S,int n) {
InitStack(S);//初始化栈
int i;
for (i = 0; i < n; i++) {
int e;
scanf_s("请输入一个元素:%d", e);
Push(S, e);
}
printf("新栈创建成功!\n");
}
入栈操作
Status Push(LStackList& S, SElenType e) {
LStackList p = new LStack;//生成新的节点
p->data = e;//新节点的数据赋值
p->next = S;//新节点的指针指向头节点
S = p;//更新栈顶元素为新插入的元素
printf("元素%d入栈成功!\n", e);
return 0;
}
出栈操作
Status Pop(LStackList& S, SElenType e) {
if (!S->next) {
printf("这是一个空栈!\n");
return 0;
}
LStackList p = S;
S = S->next;
free(p);
printf("元素%d出栈成功!\n", e);
}
取栈顶元素
Status GetTop(LStackList& S, SElenType e) {
if (StackEmpty(S)) {//判空
printf("这是一个空栈!\n");
return 0;
}
e = S->data;
printf("该栈的栈顶元素是:%d\n", e);
return 0;
}
查询栈中的元素个数(栈长)
Status StackLength(LStackList S) {
LStackList p = S;//p指向栈顶元素
int count = 0;
while (p) {
p = p->next;
count++;
}
printf("该栈内元素个数为:%d\n", count);
return 0;
}
判断栈是否非空
bool StackEmpty(LStackList S) {
if (S->next == NULL) {
printf("这是一个空栈!\n");
return true;
}
printf("这不是一个空栈!\n");
return false;
}
栈置空
Status ClearStack(LStackList& S) {
if (S->next != NULL) S->next = NULL;
printf("栈的置空操作成功!\n");
return 0;
}
销毁栈
Status DestoryStack(LStackList& S) {
LStackList p = S;
LStackList pre = new LStack;
//判空,可以调用StackEmpty(LStackList S)方法
if (p->next = NULL) printf("这是一个空栈!\n"); exit(OVERFLOW);
while (p->next) {
pre = p;
p = p->next;
delete(pre);
}
printf("栈销毁成功!/n");
return 0;
}
查找元素e在栈中的位序
Status LocateElem(LStackList S, SElenType e) {
LStackList p = S->next;//初始化,p指向第一个结点
int j = 1;//计数
int flag = 0;//判断该元素是否在栈中
while (p != NULL) {
if(p->data=e){
flag = 1;
break;
}
p = p->next;
j++;
}
if(!flag){
printf("该栈中没有要查找到元素!\n");
}
else {
printf("该元素%d在栈中的位序是:%d", e, j);
}
}
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