线性结构——栈

//函数声明:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_MEMORY 100
#define STACK_GROW_MEMORY 10
typedef int ElemType;
typedef struct stack
{
	ElemType *esp;
	ElemType *ebp;
	int size;                           //记录当前栈内空间最多能存几个元素
}stack;

//函数实现:
void creatstack(stack *S)
{
	S->ebp = (ElemType *)malloc(sizeof(ElemType)* STACK_INIT_MEMORY);
	if (S->ebp == NULL)                      //判断动态内存是否开辟成功
		exit(1);
	S->size = STACK_INIT_MEMORY;
	S->esp = S->ebp;
}
int push(stack *S, ElemType x)
{
	if (S->esp - S->ebp >= S->size)    //判断当前栈是否已满
	{                                 //栈满追加空间
		S->ebp = (ElemType *)realloc(S->ebp, sizeof(ElemType)*(S->size + STACK_GROW_MEMORY));
		if (S->ebp == NULL)
			exit(1);
		S->esp = S->ebp + S->size;              //让栈顶指针向后偏移指向要入栈的位置
		S->size += STACK_GROW_MEMORY;
	}
	*S->esp++ = x;
	return 1;
}
int pop(stack *S, ElemType *x)
{
	if (S->esp == S->ebp)
		return 0;
	else
	{
		*x = *--S->esp;
		return 1;
	}
}
int getesp(stack *S, ElemType *x)
{
	if (S->esp == S->ebp)
		return 0;
	else
	{
		*x = *(S->esp - 1);
		return 1;
	}
}
int stacklength(stack *S)
{
	return S->esp - S->ebp;
}
void destorystack(stack *S)
{
	if (S->ebp != NULL)                               //销毁栈
		free(S->ebp);
}

//函数测试:
#include"stack.h"
int main()
{
	printf("************************************\n");
	printf("*0.exit            1.creatstack    *\n");
	printf("*2.push            3.pop           *\n");
	printf("*4.getesp          5.stacklength   *\n\n\n");
	stack ret;
	ret.ebp = NULL;
	ElemType x;
	int n = 0;
	while (1)
	{
		printf("请选择功能:");
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			destorystack(&ret);
			exit(1);
			break;
		case 1:
			if (ret.ebp != NULL)
			{
				destorystack(&ret);          //如果当前已经创建了一个栈,则先销毁在创建
			}                         
			creatstack(&ret);
			printf("创建成功\n");
			break;
		case 2:
			printf("请输入入栈元素:");
			scanf("%d", &x);
			push(&ret, x);
			printf("入栈成功\n");
			break;
		case 3:
			if (pop(&ret, &x) == 0)
				printf("栈是空栈!\n");
			else
				printf("弹出成功,弹出元素:%d\n", x);
			break;
		case 4:
			if (getesp(&ret,&x) == 0)
				printf("栈是空栈!\n");
			else
				printf("栈顶元素:%d\n",x);
			break;
		case 5:
			printf("栈的长度:%d\n", stacklength(&ret));
			break;
		default:
			printf("选择无效\n");
			break;
		}
	}
	system("pause");
	return 0;
}
时间: 2024-07-29 11:43:26

线性结构——栈的相关文章

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

线性结构栈之链表实现

#include<stdio.h> #include<malloc.h> #include<stdlib.h> //结点数据类型 typedef struct Node { int data; struct Node *next; }NODE,*PNODE; //栈数据类型 typedef struct { PNODE top; int cnt; }Stack; //想想看,为什么栈的数据结构是这样,我是这样思考的,如果你不这样写可以, //那你必须造出一个计数的结点和

线性结构——栈和队列

栈类 1 public class MyStack<T> { 2 //栈的大小 3 private int size; 4 //存放栈的数组 5 private Object[] data; 6 7 /** 8 * 无参构造方法,初始化数组大小 9 */ 10 public MyStack() { 11 size = -1; 12 data = new Object[10]; 13 } 14 15 /** 16 * 有参构造方法,自定义数组大小 17 */ 18 public MyStack(

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

2、线性结构——数据结构【基础篇】

线性结构 线性结构的4大特点: 1.有一个结点只有前驱 2.有一个结点只有后继 3.其他结点既有一个前驱也有一个后继 4.在逻辑上相邻在物理上也相邻数据的逻辑关系叫做线性结构 线性结构的3大类型: 1.线性表--线性表是n个数据元素的有限序列 存储结构: 顺序存储对应一组操作:顺序表 链式存储对应一组操作:单向链表.双向链表.循环链表 2.栈--限定只在表的一端(表尾)进行插入和删除操作的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),其这一端被固定了. 存储结构

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

数据结构-线性表-栈

栈:后进先出(LIFO) last in first out栈是一种特殊的线性表,只能在线性表的一端进行操作.栈顶 top栈底 bottom 实现方式:顺序结构实现,线性结构实现 链式存储实现 LinkStack.h #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; LinkStack* LinkStack_Create(); void LinkStack_Destroy(LinkStack* stack);

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外