栈的基本操作(创建栈,压栈,出栈,遍历栈,清空栈,判断是否为空栈)

2023-11-20

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node{
	int data;
	struct Node *pNext;
}NODE,* PNODE;

typedef struct Stack{
	PNODE pTop;
	PNODE pBottom;
}STACK,* PSTACK;//PSTACK 等价于struct STACK * 

void init(PSTACK);
void push(PSTACK,int );
void traverse(PSTACK); 
bool pop(PSTACK,int *);
void clear(PSTACK);
int main(){
	STACK S;//STACK 等价于 struct Stack 
	
	int val;
	init(&S);//目的造出一个空栈 
	push(&S, 1); //压栈 
	push(&S, 2);
	push(&S, 3);
	push(&S, 4);
	traverse(&S);//遍历输出 
//	clear(&S);
//	traverse(&S);//遍历输出 
	
	if(pop(&S,&val)){
		printf("出栈成功,出栈元素是%d\n",val);
	} else{
		printf("出栈失败!\n");
	}
	return 0;
	
} 
void init(PSTACK pS){
	pS->pTop=(PNODE)malloc(sizeof(NODE));
	if(NULL==pS->pTop){
		printf("动态内存分配失败!\n");
		exit(-1);
	}else{
		pS->pBottom=pS->pTop;
		pS->pTop->pNext=NULL;//pS->pButtom->pNext=NULL;
	}
}
void push(PSTACK pS,int val){
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	pNew->data=val;
	pNew->pNext=pS->pTop;//pS->pTop不能改成pS->Buttom
	pS->pTop=pNew;
	return;
}

void traverse(PSTACK pS){
	PNODE p=pS->pTop;
	
	while(p!=pS->pBottom){
		printf("%d  ",p->data);
		p=p->pNext;
	}
	printf("\n");
	
	return;
}
bool empty(PSTACK pS){
	if(pS->pTop==pS->pBottom)
		return true;
		else
		return false;
}
//把pS所指向的栈出栈一次,并把出栈的元素存入pVal所指向的变量中,如果出栈失败,返回false,否则返回true 
bool pop(PSTACK pS,int *pVal){
	if(empty(pS)){//pS本身存放的就是S的地址 
		return false;
	} else{
		PNODE r=pS->pTop;
		*pVal=r->data; 
		pS->pTop=r->pNext;
		free(r);
		r=NULL;
		
		return true;
	} 

} 
//clear 清空 
void clear(PSTACK pS){
	if(empty(pS)){
		return ;
	}else{
		PNODE p=pS->pTop ;
		PNODE q=NULL;
		
		while(p!=pS->pBottom){
			q=p->pNext;
			free(p);
			p=q;
		}
		pS->pTop=pS->pBottom;
	}
	
}

在这里插入图片描述
Love is patient, love is kind. It does not envy, it does not boast, it is not proud. (The Bible)
爱是恒久忍耐,又有恩慈;爱是不嫉妒,爱是不自夸,不张狂。——《圣经》

向林
2020年2月16日于重庆城口
好好学习,天天向上,终有所获

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

栈的基本操作(创建栈,压栈,出栈,遍历栈,清空栈,判断是否为空栈) 的相关文章

  • 为什么 Java Vector(和 Stack)类被认为已过时或已弃用?

    为什么 Java Vector 被视为遗留类 已过时或已弃用 在处理并发时它的使用不是有效的吗 如果我不想手动同步对象 只想使用线程安全集合 而不需要制作底层数组的新副本 如CopyOnWriteArrayList是 那么可以使用吗Vect
  • 内存管理、堆损坏和 C++

    所以 我需要一些帮助 我正在开发一个 C 项目 然而 我认为我已经设法破坏了我的堆 这是基于我添加了一个事实std string给一个类并为其分配另一个类的值std string std string hello Hello world n
  • 链表的中间节点

    链表的中间节点 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems
  • 单向不带头链表的使用

    单向不带头链表的使用 链表的创建 typedef struct LNode SLDataType data struct LNode next LNode LinkList 按位查找 LNode GetElem LinkList L int
  • Linux 内核如何强制堆栈大小限制?

    我知道堆栈大小可以通过限制工具进行控制 但是内核如何强制执行其中一些限制 例如 RLIMIT STACK 由于linux不涉及堆栈操作 只是mov或push指令 那么当超出限制时内核如何发出SIGSEGV 据我了解 对于虚拟寻址 CPU 提
  • 如何用一个数组实现3个栈?

    有时 我会遇到以下面试问题 如何用一个数组实现3个堆栈 当然 任何静态分配都不是解决方案 空间 而非时间 高效 你可以 1 定义两个堆栈 从数组端点开始并沿相反方向增长 2 将第三个堆栈定义为从中间开始并向您想要的任何方向增长 3 重新定义
  • C# 检查表达式括号是否有效[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 表达方式 a i 1 8 9 应该返回 true 因为这样编写语法是有效的 每个左括号在正确的位置都有一个右闭合器 并且所有括号都处于
  • 为什么后续的 Rust 变量会递增堆栈指针而不是递减它?

    我发现很奇怪的是 当你在 Rust 中创建静态分配的变量时 它似乎随着堆栈指针的增加而增加 我知道情况并非如此 因为堆栈指针随着内存分配而减少 如果我在 C 中做同样的事情 我会看到堆栈指针随着我创建更多变量而减少 为什么会这样呢 Rust
  • 第一次捆绑安装,堆栈级别太深

    我使用命令创建了一个全新的 Rails 项目rails new qbc database mysql 它完美地创建了所有文件 但是 在捆绑包安装时出现错误 bundle install Fetching gem metadata from
  • 如何找到最大堆栈大小?

    我正在使用 Ubuntu 11 04 如何找出进程的最大调用堆栈大小以及堆栈的每个帧的大小 快速谷歌搜索应该会显示关于这个主题的一些信息 http www cs nyu edu exact core doc stackOverflow tx
  • 什么是 C/C++ 数据段和堆栈大小?

    我读到这取决于编译器和操作系统架构 如何在使用 GCC 作为编译器的 Linux 系统上找到数据段和堆栈最大大小 让我和你一起实验一下 创建文件 test c 如下所示 int main void return 0 现在编译它 指定最大堆栈
  • c++ Vector,每当它在堆栈上扩展/重新分配时会发生什么?

    我是 C 新手 我在我的项目中使用向量类 我发现它非常有用 因为我可以拥有一个在必要时自动重新分配的数组 即 如果我想推回一个项目并且向量已达到其最大容量 它会重新分配自身 向操作系统请求更多内存空间 所以访问向量的元素非常快 它不像列表
  • 增加java中单个工作线程的堆栈空间

    在我的java web应用程序中 我有一个后台工作线程 它需要大量的堆栈空间 因为它使用activiti工作流引擎和groovy脚本任务运行一个非常复杂的工作流 目前 我需要在 64 位 Java 和 Tomcat 上将 JVM Xss 设
  • 为什么在函数堆栈上返回值不安全

    我在阅读 bruce eckel 时遇到了以下段落 他试图解释为什么函数在堆栈上返回值不安全 现在想象一下如果一个普通函数尝试在堆栈上返回值会发生什么您不能触及返回地址上方堆栈的任何部分 因此该函数必须将值推入返回地址下方 但是当执行汇编语
  • Bluecove:以编程方式重新启动蓝牙堆栈

    我正在尝试关闭蓝牙服务 但 Bluecove 在连接关闭方法上有错误 https code google com p bluecove issues detail id 90 https code google com p bluecove
  • 从 Android 应用程序堆栈中手动删除活动

    我一直在开发 Android Native App 我想做的是 Activities A gt B gt C Then A gt B gt C gt C 从 C Activity 中 如果它再次指向 C 那么我想手动从堆栈中删除 C B 在
  • 在 Ubuntu 11.04 中禁用堆栈崩溃保护

    我在 2007 年 MacBook 上运行 32 位 Ubuntu 11 04 并且刚刚开始了解缓冲区溢出漏洞 我正在尝试运行书中的示例程序 但 Ubuntu 的安全措施使我无法成功执行缓冲区溢出 这是我尝试运行的代码 include
  • 使用 Stacks Java 将中缀转换为 Postfix

    我正在尝试编写一个程序将中缀表达式转换为后缀表达式 我正在使用的算法如下 1 Create a stack 2 For each character t in the expression If t is an operand append
  • 为什么C++中的内置堆栈接口没有clear()函数?

    在进一步使用它之前 我必须清空堆栈 我确实明白可以这样做 while mystack empty mystack pop 没有这个功能有什么具体原因吗 或者只是第一次制作时没有人感受到它的要求而被排除在外 另外 Java 中的堆栈接口确实有
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调

随机推荐