数据结构-线性结构-栈-链栈的两种实现方法的初步实现

目录

1.包含头结点的链栈: 

2.不包含头结点的链栈:

包含头结点的链栈:

#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;
}

结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值