数据结构——C++中实现栈链(含完整代码)

2023-11-01

栈链相关代码。

1、向栈顶插入元素
2、删除栈顶元素
3、判断栈是否为空 
4、读取栈顶元素
0、退出程序

栈其实就是一个特殊的线性表(输入输出只能在一端)

基于这一特性完成栈链的相关操作

注意事项:

由于插入和删除操作只可以在一端(链表头部),所以在构建栈链时不需要设置头结点。

栈链初始化如下

//初始化栈链
void InisStack(StackList& S) {
	S = NULL; //栈顶置空
}

在进行删除栈顶元素和读取栈顶元素时,都需要判断栈内是否为空,所以采用bool类型返回值。

删除栈顶元素代码如下:

//判断栈是否为空
bool StackEmpty(StackList S) {
	if (S == NULL) {
		return true;
	}
	return false;
}

//出栈操作
bool Pop(StackList& S, int& i) {
	if (StackEmpty(S))
		return false;

	StackNode* s = S;
	S = S->next;
	i = s->data;
	free(s);

	return true;
}

完整代码:

纯手打,亲测可以运行,使用自取。

#include <iostream>
using namespace std;

//链结点
typedef struct StackNode {
	int data;
	struct StackNode* next;
}StackNode,*StackList;

//初始化栈链
void InisStack(StackList& S) {
	S = NULL; //栈顶置空
}

//入栈操作
void Push(StackList& S, int i) {
	StackNode* s = (StackNode*)malloc(sizeof(StackNode));
	if (s == NULL) {
		cout << "内存分配失败" << endl;
	}
	s->data = i;
	s->next = S;
	S = s;
}

//判断栈是否为空
bool StackEmpty(StackList S) {
	if (S == NULL) {
		return true;
	}
	return false;
}

//出栈操作
bool Pop(StackList& S, int& i) {
	if (StackEmpty(S))
		return false;

	StackNode* s = S;
	S = S->next;
	i = s->data;
	free(s);

	return true;
}

//读栈操作
bool GetTop(StackList S, int& i) {
	if (StackEmpty(S))
		return false;
	i = S->data;
	return true;
}

int main() {
	StackList S;
	InisStack(S);

	while (true) {

		cout << "=========================================" << endl;
		cout << "=======|  1、向栈顶插入元素      |=======" << endl;
		cout << "=======|  2、删除栈顶元素        |=======" << endl;
		cout << "=======|  3、判断栈是否为空      |=======" << endl;
		cout << "=======|  4、读取栈顶元素        |=======" << endl;
		cout << "=======|  0、退出程序            |=======" << endl;
		cout << "=========================================" << endl;
		cout << "你要实现的功能:" << endl;
		cout << "================" << endl;

		int select;
		cin >> select;

		switch (select) {
		case 1://入栈
			cout << "你想要插入的数值是: " << endl;
			int temp1;
			cin >> temp1;
			Push(S, temp1);
			cout << "插入成功" << endl;
			system("pause");
			system("cls");
			break;
		case 2://出栈
			int temp2;
			if (Pop(S, temp2))
				cout << "已删除,删除的元素为:" << temp2 << endl;
			else
				cout << "该栈为空栈" << endl;
			system("pause");
			system("cls");
			break;
		case 3://判断是否为空
			if (StackEmpty(S))
				cout << "该栈为空栈" << endl;
			else
				cout << "该栈不为空栈" << endl;
			system("pause");
			system("cls");
			break;
		case 4://读取栈顶元素
			int temp3;
			if (GetTop(S, temp3))
				cout << "栈顶元素为:" << temp3 << endl;
			else
				cout << "该栈为空栈" << endl;
			system("pause");
			system("cls");
			break;
		case 0:
			cout << "已退出" << endl;
			exit(0);
		default:
			cout << "输入有误,请重新输入" << endl;
			break;
		}
	}
}

部分运行结果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——C++中实现栈链(含完整代码) 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐