目录:
包含头结点的链栈:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct stackNode {
SElemType elem;
struct stackNode* next;
}StackNode;
typedef StackNode* LinkStack;
Status InitStack(LinkStack& s);
Status CreateStack(LinkStack& s);
Status DestroyStack(LinkStack& s);
Status ClearSatck(LinkStack& s);
Status StackEmpty(LinkStack& s);
int StackLength(LinkStack& s);
SElemType GetTop(LinkStack& s);
Status Push(LinkStack& s, int e);
Status Pop(LinkStack& s, SElemType& e);
Status StackTraverse(LinkStack& s);
int main() {
LinkStack s =0;
InitStack(s);
std::cout << StackLength(s) << std::endl;
StackTraverse(s);
DestroyStack(s);
StackTraverse(s);
CreateStack(s);
StackTraverse(s);
std::cout << StackLength(s) << std::endl;
Push(s, 9999);
StackTraverse(s);
SElemType e;
Pop(s, e);
StackTraverse(s);
std::cout << e << std::endl;
std::cout << GetTop(s) << std::endl;
ClearSatck(s);
std::cout << StackEmpty(s) << std::endl;
StackTraverse(s);
DestroyStack(s);
StackTraverse(s);
return 0;
}
Status InitStack(LinkStack& s) {
if (s) {
std::cerr << "请误重复初始化" << std::endl;
return ERROR;
}
s = (StackNode*)malloc(sizeof(StackNode));
if (!s) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
s->next = 0;
return OK;
}
Status CreateStack(LinkStack& s) {
if (InitStack(s) == ERROR) {
return ERROR;
}
std::cout << "请输入栈的元素:" << std::endl;
std::cout << "(注:我们约定输入‘ - 1’时结束输入)" << std::endl;
SElemType temp;
do {
std::cin >> temp;
if (temp == -1) {
return OK;
}
StackNode* tempNode = (StackNode*)malloc(sizeof(StackNode));
if (!tempNode) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
tempNode->elem = temp;
tempNode->next = s->next;
s->next = tempNode;
} while (temp != -1);
return ERROR;
}
Status DestroyStack(LinkStack& s) {
if (!s) {
std::cerr << "要销毁的栈不存在。" << std::endl;
return ERROR;
}
while (s) {
StackNode* temp = s;
s = s->next;
free(temp);
}
return OK;
}
Status ClearSatck(LinkStack& s) {
if (!s) {
std::cerr << "要重置的栈不存在。" << std::endl;
return ERROR;
}
if (!s->next) {
std::cerr << "要重置的栈为空。" << std::endl;
return ERROR;
}
while (s->next) {
StackNode* temp = s->next;
s->next = s->next->next;
free(temp);
}
return OK;
}
Status StackEmpty(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
return s->next ? false : true;
}
int StackLength(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
int length = 0;
StackNode* temp = s->next;
while (temp) {
++length;
temp = temp->next;
}
return length;
}
SElemType GetTop(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
if (!s->next) {
std::cerr << "要查询的栈为空。" << std::endl;
return ERROR;
}
return s->next->elem;
}
Status Push(LinkStack& s, int e) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
StackNode* tempNode = (StackNode*)malloc(sizeof(StackNode));
if (!tempNode) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
tempNode->elem = e;
tempNode->next = s->next;
s->next = tempNode;
return OK;
}
Status Pop(LinkStack& s, SElemType& e) {
if (!s) {
std::cerr << "要修改的栈不存在" << std::endl;
return ERROR;
}
if (!s->next) {
std::cerr << "要修改的栈为空。" << std::endl;
return ERROR;
}
e = s->next->elem;
StackNode* temp = s->next;
s->next = s->next->next;
free(temp);
return OK;
}
Status StackTraverse(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
if (!s->next) {
std::cerr << "要查询的栈为空。" << std::endl;
return ERROR;
}
StackNode* temp = s->next;
std::cout << "以下是存储在线性表的内容:" << std::endl;
while (temp) {
std::cout << temp->elem << " ";
temp = temp->next;
}
std::cout << std::endl;
return OK;
}
结束。
不包含头结点的链栈:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct stackNode {
SElemType elem;
struct stackNode* next;
}StackNode;
typedef StackNode* LinkStack;
Status InitStack(LinkStack& s);
Status CreateStack(LinkStack& s);
Status DestroyStack(LinkStack& s);
Status ClearSatck(LinkStack& s);
Status StackEmpty(LinkStack& s);
int StackLength(LinkStack& s);
SElemType GetTop(LinkStack& s);
Status Push(LinkStack& s, int e);
Status Pop(LinkStack& s, SElemType& e);
Status StackTraverse(LinkStack& s);
int main() {
LinkStack s;
InitStack(s);
std::cout << StackLength(s) << std::endl;
StackTraverse(s);
DestroyStack(s);
StackTraverse(s);
CreateStack(s);
StackTraverse(s);
std::cout << StackLength(s) << std::endl;
Push(s, 9999);
StackTraverse(s);
SElemType e;
Pop(s, e);
StackTraverse(s);
std::cout << e << std::endl;
std::cout << GetTop(s) << std::endl;
ClearSatck(s);
std::cout << StackEmpty(s) << std::endl;
StackTraverse(s);
DestroyStack(s);
StackTraverse(s);
return 0;
}
Status InitStack(LinkStack& s) {
/*if (s) {
std::cerr << "请误重复初始化" << std::endl;
return ERROR;
}*/
s = 0;
return OK;
}
Status CreateStack(LinkStack& s) {
InitStack(s);
std::cout << "请输入栈的元素:" << std::endl;
std::cout << "(注:我们约定输入‘ - 1’时结束输入)" << std::endl;
SElemType temp;
do{
std::cin >> temp;
if (temp == -1) {
return OK;
}
StackNode* tempNode = (StackNode*)malloc(sizeof(StackNode));
if (!tempNode) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
tempNode->elem = temp;
tempNode->next = s;
s = tempNode;
} while (temp != -1);
return ERROR;
}
Status DestroyStack(LinkStack& s) {
if (!s) {
std::cerr << "要销毁的栈不存在。" << std::endl;
return ERROR;
}
while (s) {
StackNode* temp = s;
s = s->next;
free(temp);
}
return OK;
}
Status ClearSatck(LinkStack& s) {
if (!s) {
std::cerr << "要重置的栈不存在。" << std::endl;
return ERROR;
}
while (s) {
StackNode* temp = s;
s = s->next;
free(temp);
}
return OK;
}
Status StackEmpty(LinkStack& s) {
return s? false : true;
}
int StackLength(LinkStack& s) {
/*if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}*/
int length = 0;
StackNode* temp = s;
while (temp) {
++length;
temp = temp->next;
}
return length;
}
SElemType GetTop(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
return s->elem;
}
Status Push(LinkStack& s, int e) {
/*if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}*/
StackNode* tempNode = (StackNode*)malloc(sizeof(StackNode));
if (!tempNode) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
tempNode->elem = e;
tempNode->next = s;
s = tempNode;
return OK;
}
Status Pop(LinkStack& s, SElemType& e) {
if (!s) {
std::cerr << "要修改的栈为空" << std::endl;
return ERROR;
}
e = s->elem;
StackNode* temp = s;
s = s->next;
free(temp);
return OK;
}
Status StackTraverse(LinkStack& s) {
if (!s) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
StackNode* temp = s;
std::cout << "以下是存储在线性表的内容:" << std::endl;
while (temp) {
std::cout << temp->elem << " ";
temp = temp->next;
}
std::cout << std::endl;
return OK;
}
结束。