#include<iostream>
#include<cstdlib>
#include<cstdio>
#define INIT_SIZE 10
#define OK 1
#define ERROR 0
#define OVER_FLOW -1
typedef int SElemType;
typedef int Status;
typedef struct stack {
SElemType* top;
SElemType* base;
int stack_size;
}Stack;
Status InitStack(Stack& s);
Status CreateStack(Stack& s);
Status DestroyStack(Stack& s);
Status ClearSatck(Stack& s);
Status StackEmpty(Stack& s);
long StackLength(Stack& s);
SElemType GetTop(Stack& s);
Status Push(Stack& s, int e);
Status Pop(Stack& s, SElemType& e);
Status StackTraverse_0(Stack& s);
Status StackTraverse_1(Stack& s);
int main() {
Stack s;
s.base = 0;
InitStack(s);
std::cout << StackLength(s) << std::endl;
StackTraverse_0(s);
DestroyStack(s);
StackTraverse_0(s);
CreateStack(s);
StackTraverse_0(s);
std::cout << StackLength(s) << std::endl;
Push(s, 9999);
StackTraverse_1(s);
SElemType e;
Pop(s, e);
StackTraverse_1(s);
std::cout << e << std::endl;
std::cout<<GetTop(s) << std::endl;
ClearSatck(s);
std::cout<<StackEmpty(s) << std::endl;
StackTraverse_0(s);
DestroyStack(s);
StackTraverse_1(s);
return 0;
}
Status InitStack(Stack& s) {
if (s.base || s.stack_size >= 0) {
std::cerr << "请误重复申请内存空间" << std::endl;
return ERROR;
}
s.base = 0;
s.base = (SElemType*)malloc(sizeof(SElemType) * INIT_SIZE);
if (!s.base) {
std::cerr << "申请内存空间失败" << std::endl;
exit(ERROR);
}
s.top = s.base;
s.stack_size = INIT_SIZE;
return OK;
}
Status CreateStack(Stack& s) {
if (InitStack(s) == ERROR) {
return ERROR;
}
std::cout << "请输入栈的元素:" << std::endl;
std::cout << "(注:我们约定输入‘ - 1’时结束输入)" << std::endl;
for (int n = 0; n < s.stack_size; ++n) {
SElemType temp;
std::cin >>temp;
if (temp == -1) {
return OK;
}
*s.top = temp;
++s.top;
}
std::cerr << "栈已满,无法继续输入。" << std::endl;
return OVERFLOW;
}
Status DestroyStack(Stack& s) {
if (!s.base) {
std::cerr << "要销毁的栈不存在。" << std::endl;
return ERROR;
}
free(s.base);
s.base = 0;
s.top = 0;
s.stack_size = -1;
return OK;
}
Status ClearSatck(Stack& s) {
if (!s.base) {
std::cerr << "要清空的栈不存在。" << std::endl;
return ERROR;
}
s.top = s.base;
return OK;
}
Status StackEmpty(Stack& s) {
if (!s.base) {
std::cerr << "要判断的栈不存在。" << std::endl;
return ERROR;
}
return s.base == s.top ? true : false;
}
long StackLength(Stack& s) {
if (!s.base) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
return s.top - s.base;
}
SElemType GetTop(Stack& s) {
if (!s.base) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
if (s.top == s.base) {
std::cerr << "要查询的栈为空。" << std::endl;
return ERROR;
}
return *(s.top - 1);
}
Status Push(Stack& s, int e) {
if (!s.base) {
std::cerr << "要添加的栈不存在。" << std::endl;
return ERROR;
}
if (s.top - s.base == s.stack_size) {
std::cerr << "要添加的栈已满。" << std::endl;
return ERROR;
}
*s.top = e;
++s.top;
return OK;
}
Status Pop(Stack& s, SElemType& e) {
if (!s.base) {
std::cerr << "要删除的栈不存在。" << std::endl;
return ERROR;
}
if (s.top == s.base) {
std::cerr << "要删除的栈为空。" << std::endl;
return ERROR;
}
e = *--s.top;
return OK;
}
Status StackTraverse_0(Stack& s) {
if (!s.base) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
if (s.top == s.base) {
std::cerr << "要查询的栈为空。" << std::endl;
return ERROR;
}
SElemType* temp = s.top-1;
std::cout << "以下是存储在线性表的内容:" << std::endl;
while (temp >=s.base) {
std::cout << *temp << " ";
--temp;
}
std::cout << std::endl;
return OK;
}
Status StackTraverse_1(Stack& s) {
if (!s.base) {
std::cerr << "要查询的栈不存在。" << std::endl;
return ERROR;
}
if (s.top == s.base) {
std::cerr << "要查询的栈为空。" << std::endl;
return ERROR;
}
SElemType* temp = s.base;
std::cout << "以下是存储在线性表的内容:" << std::endl;
while (temp < s.top) {
std::cout << *temp << " ";
++temp;
}
std::cout << std::endl;
return OK;
}
数据结构-线性结构-栈-顺序栈的初步实现
于 2023-10-05 00:16:12 首次发布