数据结构--栈

顺序栈--静态分配内存

cpp 复制代码
/*
栈 是限定仅在表尾进行插入或删除操作的线性表
对于栈来说,表尾端称为栈顶,表头端称为栈底,不含元素的空表称为空i怕
栈为先进后出
栈是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端 
对于栈的基本操作只有进栈和出栈 
*/ 
//栈的顺序结构实现 
#include <stdio.h>
#define MAXSIZE 100

typedef int ElemType;
typedef struct{
	ElemType data[MAXSIZE];
	int top; 
}Stack; 

//栈的初始化
void initStack(Stack *s)
{
	s->top = -1;
}
//判断栈是否为空
int isEmpty(Stack *s)
{
	if(s->top == -1)
	{
		printf("栈为空\n");
		return 1;
	}
	else
	{
		return 0;
	}
}
//压栈
int push(Stack *s,ElemType e)
{
	if(s->top >= MAXSIZE - 1)
	{
		printf("满了\n");
		return 0;	
	}	
	s->top ++;
	s->data[s->top] = e;
	return 1;
} 
//出栈
ElemType pop(Stack* s,ElemType *e)
{
	if(s->top == -1)
	{
		printf("空的\n");
		return 0;	
	}	
	*e = s->data[s->top];
	s->top --;
	return 1;
} 
//获取栈顶元素
int getTop(Stack* s,ElemType *e)
{
	if(s->top == -1)
	{
		printf("空的\n");
		return 0;
	}
	*e = s->data[s->top];
	return 1;
}
cpp 复制代码
int main()
{
	Stack s;
	initStack(&s);
	push(&s,10);
	push(&s,20);
	ElemType e1;
	getTop(&s,&e1);
	printf("栈顶元素为:%d\n",e1);
	ElemType e2;
	pop(&s,&e2);
	printf("pop出的元素为:%d\n",e2);
	getTop(&s,&e1);
	printf("栈顶元素为:%d\n",e1);
	return 0;
} 

栈---动态分配内存

cpp 复制代码
typedef int ElemType;
typedef struct{
	ElemType *data;
	int top; 
}Stack; 

//栈的初始化
Stack* initStack()
{
	Stack *s = (Stack*)malloc(sizeof(Stack));
	s->data = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
	s->top = -1;
	return s;
}

出栈和入栈部分上面的代码都可以用

栈--链式结构

cpp 复制代码
//栈的链式结构实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

typedef int ElemType;
typedef struct stack{
	ElemType data;
	struct stack *next; 
}Stack; 

//栈的初始化
Stack* initStack()
{
	Stack *s = (Stack*)malloc(sizeof(Stack));
	s->data = 0;
	s->next = NULL;
	return s;
}
//判断栈是否为空
int isEmpty(Stack *s)
{
	if(s->next == NULL)
	{
		printf("栈为空\n");
		return 1;
	}
	else
	{
		return 0;
	}
}
//压栈
int push(Stack *s,ElemType e)
{
	Stack *p = (Stack*)malloc(sizeof(Stack));
	p->data = e;
	p->next = s->next;
	s->next = p;
	return 1;
} 
//出栈
ElemType pop(Stack* s,ElemType *e)
{
	if(s->next == NULL)
	{
		printf("空的\n");
		return 0;	
	}	
	*e = s->next->data;
	Stack* q = s->next;
	s->next = q->next;
	free(q);
	return 1;
} 
//获取栈顶元素
int getTop(Stack* s,ElemType *e)
{
	if(s->next == NULL)
	{
		printf("空的\n");
		return 0;
	}
	*e = s->next->data;
	return 1;
}
cpp 复制代码
int main()
{
	Stack *s = initStack();
	push(s,10);
	push(s,20);
	ElemType e1;
	getTop(s,&e1);
	printf("栈顶元素为:%d\n",e1);
	ElemType e2;
	pop(s,&e2);
	printf("pop出的元素为:%d\n",e2);
	getTop(s,&e1);
	printf("栈顶元素为:%d\n",e1);
	return 0;
} 
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486663 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法