数据结构栈和队列


一、栈(stack)


1、基本概念

  • 栈是一种特殊的线性表,又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表
  • 插入删除运算仅限定在线性表的某一端进行,不能再表中间和另一端进行
  • 栈的插入操作称为进栈(入栈、Push),删除操作称为出栈(退栈、Pop)
  • 栈顶:允许进行插入和删除的一端称为栈顶        栈底:另一端,固定不变
  • 栈顶元素:处于栈顶位置的数据元素
  • 空栈:不含任何数据元素的栈

2、基本运算

初始化栈 : InitStack(S) 建立一个空栈S。
销毁栈 : DestroyStack(S) 释放栈S占用的内存空间。进栈Push(S, x)。将元素x插入栈S中,使x成为栈S的栈顶元素。
出栈: Pop(S, x ) 当栈S不空时,将栈顶元素赋给x,并从栈中删除当前栈顶。
取栈顶元素 : GetTop(S) 若栈S不空,取栈顶元素x并返回1;否则返回0。
判断栈空 : StackEmpty(S) 。判断栈S是否为空栈。
示例

 

3、栈的顺序存储结构(顺序栈)

顺序栈类型声明:

静态分配:

  • 顺序栈通常由一个一维数组data和一个记录栈顶元素位置的变量top组成
  • 习惯上将栈底放在数组下标小的那端栈顶元素由栈顶指针top所指向

动态分配

  • base表示栈底指针,栈底固定不变
  • top指示当前栈顶位置,栈顶随着进栈和退栈操作而变化
  • top==base作为栈空的标记
  • 每次top指向栈顶数组中的下一个存储位置
#define STACK_INIT_SIZE 100			//存储空间初始分配量 
#define STACK_INCREAMENT 10			//存储空间分配增量 
typedef char ElemType;

//静态分配
typedef struct{
    ElemtType elem[STACK_INIT_SIZE];    //一维数组
    int top;                              //记录栈顶元素位置的变量
}SqStack;


//动态分配
typedef struct
{
	ElemType *base;					//栈底指针 
	Elemtype *top;					//栈顶指针 
	int stacksize;					//栈空间大小 
 } SqStack;							//顺序栈 

 

插入删除过程中只有top指针变化

对于顺序栈S,可通过动态申请得到其存储空间,它有4个要素

栈空条件:S.top==S.base

栈满条件:S.top-S.base>=S.stacksize

元素e进栈操作:*(S.top)++=e                //先进行*(S.top)运算再进行++运算

元素e出栈操作:e=*- - S.top                  //先进行- -操作再把- -s.top的值赋给e

基本算法设计

1、初始化栈

主要操作:通过动态申请所需的存储空间,并且 初始化相关的参数(top,base,stacksize)。
void InitStack(SqStack &S)
{
	if(!(S.base=(Elemtype*)malloc(STACK_INIT_SIZE *sizeof(ElemtType))))
	exit(OVERFLOW);//存储分配失败
	S.tpo=S.base;//空栈 
	S.stacksize=STACK_INIT_SIZE; //栈空间大小 
}

2、销毁栈

主动释放空间,   栈顶、栈底 两个指针置空, 栈空间 大小置零
void DestroyStack(SqStack &S)
{
	free(S.base);
	S.base=NULL;
	S.top=NULL;
	S.stacksize=0;
}

3、进栈

主要操作:判断是否存在“溢出”
void Push(Sqstack &S,Elemtype e)
{
	if(S.top-S.base>=S.stack)
	{	//栈满,追加存储空间 
		S.base=(ElemType*)realloc(S.base,(S.stacksize+STACK+INCREMENT)*sizeof(ElemType));
		if(S.base)
			exit(OVERFLOW);            //存储分配失败	
		S.top=S.base+
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来解释一下这个程序每一个代码的作用,以及在整个程序中的效果: ```c #include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 typedef struct { int *base; // 栈底指针 int *top; // 栈顶指针 int stack_size; // 当前已分配的存储空间大小 } Stack; void InitStack(Stack *S) { S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); // 为栈申请初始空间 if (!S->base) { exit(0); } S->top = S->base; S->stack_size = STACK_INIT_SIZE; } void Push(Stack *S, int e) { if (S->top - S->base >= S->stack_size) { // 栈空间已满,需要扩容 S->base = (int *)realloc(S->base, (S->stack_size + STACK_INCREMENT) * sizeof(int)); if (!S->base) { exit(0); } S->top = S->base + S->stack_size; S->stack_size += STACK_INCREMENT; } *(S->top) = e; // 入栈 S->top++; } int Pop(Stack *S, int *e) { if (S->top == S->base) { // 栈为空,出栈失败 return 0; } S->top--; *e = *(S->top); // 出栈 return 1; } int main() { int n, e; Stack S; InitStack(&S); // 初始化栈 printf("请输入一个十进制整数:"); scanf("%d", &n); while (n) { Push(&S, n % 2); // 将除2取余的结果入栈 n /= 2; } printf("转换为二进制的结果是:"); while (Pop(&S, &e)) { // 依次出栈,输出结果 printf("%d", e); } printf("\n"); return 0; } ``` 程序的主要功能是将输入的十进制整数转换为二进制数,并输出转换结果。程序使用栈来实现二进制数的转换。 代码详解: 1. 定义了一个结构体`Stack`,用于表示栈,其中包含栈底指针、栈顶指针和当前已分配的存储空间大小。 2. `InitStack`函数用于初始化栈,申请初始空间,如果失败则退出程序。初始化时,将栈顶指针指向栈底。 3. `Push`函数用于将元素压入栈中。如果栈空间已满,需要扩容,扩容的大小为`STACK_INCREMENT`。如果扩容失败,则退出程序。压入元素时,将元素存储在栈顶指针所指向的位置,然后将栈顶指针向上移。 4. `Pop`函数用于将元素弹出栈。如果栈为空,则出栈失败,返回0。如果栈不为空,则将栈顶指针向下移,取出栈顶元素,并将其存储在传入的指针变量`e`中,最后返回1表示出栈成功。 5. `main`函数是程序的主函数,主要实现输入十进制整数、转换为二进制数并输出的功能。首先初始化栈,然后通过`scanf`函数获取用户输入的十进制整数,将其转换为二进制数并压入栈中。最后,依次弹出栈中的元素,并输出转换结果。 整个程序的效果是将输入的十进制整数转换为二进制数,并输出转换结果。程序使用栈来实现转换过程,将除2取余的结果压入栈中,然后依次出栈,输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值