栈的实现(C语言实现)

//头文件
#include <stdio.h>
/*====================
栈 数据结构
利用数组实现
====================*/
#define MAX 100
#define ok 1
#define error 0
typedef struct Stack
{
	int data[MAX];
	int top;   			//栈顶
	int bottom;			//栈底
}Stack,*STACK;
//初始化栈
int InitStack(STACK stack);
//销毁
int DestroyStack(STACK stack);
//清空
int ClearStack(STACK stack);
//栈空
int StackEmpty(STACK stack);
//获取栈顶元素
int GetTop(STACK stack,int* elem);
//压栈
int Push(STACK stack,int* elem);
//出栈
int Pop(STACK stack,int* elem);
//返回栈中元素长度
int StackLength(STACK stack,int* len);
//打印栈中元素
int PrintStack(STACK stack);
//栈满
int StackFull(STACK stack);
//main函数中实现
#include "stack.h"

int main()
{
	int num=10, num1, i=0,j=0;
	Stack stack;
	int initFlag=InitStack(&stack);
	if(!initFlag)
		return 0;
	for(num1=0;num1<10;num1++)
		Push(&stack,&num1);
/*
	int pushFlag=Push(&stack,&num);
	if(!pushFlag)
		return 0;
*/
//	ClearStack(&stack);
	for(;i<10;i++)
	{
	int flag=Pop(&stack,&num1);
	if(flag)
		printf("%d ",num1);
	else
		printf("Pop error");
	}
	int lenFlag=StackLength(&stack,&num1);
	if(lenFlag)
		printf("len=%d ",num1);
	else
		printf("StackLength error");
/*
	int getFlag=GetTop(&stack,&num1);
	if(getFlag)
		printf("%d ",num1);
*/
	PrintStack(&stack);
	return 0;
}
//初始化栈
int InitStack(STACK stack)
{
	if(stack==NULL)
		return error;
	stack->bottom=stack->top=0;
	return ok;
}
//压栈
int Push(STACK stack,int* elem)
{
	int flag=StackFull(stack);
	if(!flag)
		return error;
	stack->data[stack->top]	=*elem;
	++stack->top;
	return ok;
}
//打印栈中所有元素
int PrintStack(STACK stack)
{
	int i=0;
	int flag=StackEmpty(stack);
	if(!flag)
		return error;
	for(i=0;i<stack->top;i++)
	{
		printf("%d ",stack->data[i]);
	}
	printf("\n");
	return ok;
}
//栈空
int StackEmpty(STACK stack)
{
	if(stack==NULL || stack->top==stack->bottom)
		return error;
	else
		return ok;
}
//出栈
int Pop(STACK stack,int* elem)
{
	int flag=StackEmpty(stack);
	if(!flag)
		return error;

	*elem=stack->data[stack->top-1];
	--stack->top;
	return ok;
}
//栈满
int StackFull(STACK stack)
{
	if(stack==NULL || stack->top>MAX)
		return error;
	else
		return ok;
}
//销毁
int DestroyStack(STACK stack)
{
	if(stack==NULL)
		return ok;
	else
	{
		stack->top=stack->bottom;
		stack=NULL;
		return ok;
	}
}
//清空
int ClearStack(STACK stack)
{
	int flag=StackEmpty(stack);
	if(!flag)
		return error;
	else
	{
		stack->top=stack->bottom;
		return ok;
	}
}
//获取栈顶元素
int GetTop(STACK stack,int* elem)
{
	int flag=StackEmpty(stack);
	if(!flag)
		return error;
	*elem=stack->data[stack->top-1];
	return ok;
}
//返回栈中元素长度
int StackLength(STACK stack,int* len)
{
	if(stack==NULL)
		return error;
	if(stack->top==stack->bottom)
	{
		*len=0;
		return ok;
	}
	else
	{
		*len=stack->top;
		return ok;
	}
}
时间: 2024-10-25 12:37:26

栈的实现(C语言实现)的相关文章

利用栈实现队列(C语言实现)

在上一篇优化后队列的实现(C语言实现)  中,虽然我们对队列的时间复杂度进行了优化,但是却让代码的可读性变差了,代码显得略微臃肿(当然,这些话你看看就好,主要是为了奉承这篇博文的). 这里主要实现的是:利用栈来实现队列 基本思路: 1,创建两个栈 2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列 3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移

我的全栈之路-C语言基础之集成开发环境搭建

我的全栈之路-C语言基础之集成开发环境搭建 我的全栈之路 2.1 C语言集成开发环境搭建 目前主流的操作系统(Windows,Linux,macOS)都有完善的C语言集成开发环境,用于编辑.编译.调试.打包部署C程序. 操作系统 开发工具 Windows10 1903 Visual Studio2019 macOS10.14 XCode10.3 Ubuntu18.04 QT5.13 Windows作为世界上最流行的桌面操作系统,当前最新版本为Windows10 1903,VisualStudio

我的全栈之路-C语言基础之C程序运行流程

我的全栈之路-C语言基础之C程序运行流程 我的全栈之路 4.1 C程序的运行流程 C语言编写的程序一般都要经过编写源文件->预处理->编译->汇编->链接后运行这几个流程. 预处理 预处理主要是宏替换.包含头文件.条件编译以及删除注释等操作,预编译阶段生成文件的后缀名通常是.i. 编译 编译主要是将预处理好的文件生成汇编文件,编译后文件的后缀名通常是.s. 汇编 汇编主要是将汇编文件生成二进制文件,汇编后的文件的后缀名通常是.o. 链接 链接主要是将各个二进制文件.库函数.启动代码

我的全栈之路-C语言基础之HelloWorld

我的全栈之路-C语言基础之HelloWorld 我的全栈之路 3.1 Visual Studio 2019实现HelloWorld 新建解决方案 在之前创建的Git仓库c-core-programming基础上新建项目 然后选择项目模板:基于C++的空项目 然后设置项目名称.路径以及解决方案名称 新建筛选器 在解决方案资源管理器视图下,选中源文件,然后新建筛选器 新建筛选器 筛选器的名称为Chapter1 Chapter1 新建项 新建源文件helloworld.c 编辑源文件 #include

我的全栈之路-C语言基础之Visual Studio 2019使用技巧

我的全栈之路-C语言基础之Visual Studio 2019使用技巧 我的全栈之路 5.1 Visual Studio 2019调试程序 在后期编写程序时,经验不足的开发人员通常会遇到两种错误:编译错误和运行时错误,编译错误通常是编写的程序不满足编译器的语法规范,而运行时错误则是程序运行时发生的错误,想要排查程序运行时的错误,就需要使用IDE提供的调试功能. 在源文件debug.c中定义一个返回两个整数相乘的方法mul,然后在main函数中定义两个变量,并调用两个整数相乘的方法,输出计算结果

我的全栈之路-Go语言基础之Go语言开发环境搭建

我的全栈之路-Go语言基础之Go语言开发环境搭建 我的全栈之路 2.1 Go语言编译器下载 在开发Go语言的程序之前,首先去官网 golang.google.cn下载Go语言的编译器,编译器的作用就是将开发人员使用Go语言针对Go编译器编写的Go程序编译成对应平台的机器指令.因为计算机无法识别开发人员编写的程序,需要借助Go编译器来将源程序编译成计算机识别的二进制机器指令. golang官网提供了Windows,Linux,macOS版本的Go语言编译下载 当点击Download Go后,会跳转

嵌入式开发学习(9)&lt;汇编写启动代码之设置栈和调用c语言&gt;

C语言运行时需要和栈的意义: "C语言运行时(runtime)"需要一定的条件,这些条件由汇编来提供.C语言运行时主要是需要栈 C语言与栈的关系:C语言中的局部变量都是用栈来实现的.如果我们汇编部分没有给C部分预先设置合理合法的栈地址,那么C代码中定义的局部变量就会落空,整个程序就死掉了. 我们平时在编写单片机程序(譬如51单片机)或者编写应用程序时并没有去设置栈,但是C程序还是可以运行的.原因是:在单片机中由硬件初始化时提供了一个默认可用的栈,在应用程序中我们编写的C程序其实并不是全

栈的应用java语言实现

数据结构中的栈,在解决很多问题都有用处,比如括号匹配,迷宫求解,表达式求值等等 java中有封装好的类,可以直接调用: Stack:   1-->public Stack()创建一个空堆栈   2-->public boolean empty()测试堆栈是否为空;   3-->public E pop()移除堆栈顶部的对象,并作为此函数的值返回该对象.    4-->public E push(E item)把项压入堆栈顶部 5-->public E peek()查看堆栈顶部

C语言中函数参数为什么是由右往左入栈的?

先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300);