栈(基本概念、基本操作:初始化、获取栈顶元素的值并删除、入栈、出栈、判空、获取栈中有效元素的个数、清空数据、销毁。包含具体代码)

  • 基本概念:

    //栈:限定仅在表尾进行插入和删除操作的线性表
    //栈特点:后进先出(后来的反而需要先服务(访问受限的线性表)
    //栈分为:顺序栈和链式栈
    //说明:本文件是不定长的顺序栈,能自动扩容
    //栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端称为栈底
  • 头文件.h

    #define INIT_SIZE 10
    typedef struct stack
    {
    	int* base;//指向动态内存;
    	int top;//栈顶指针(实际上它是下标,注意书上是指针)//top是当前可以存放数据的下标
    	int stacksize;//栈的总大小
    }Stack,*PStack;
    
    //初始化
    void InitStack(PStack ps);
    
    static bool IsFull(PStack ps);//没有满的概念,一满就扩容
    
    static void Inc(PStack ps);
    
    //往栈中填入数据(入栈)
    bool Push(PStack ps,int val);
    
    //获取栈顶元素的值,但不删除
    bool GetTop(PStack ps,int *rtval);
    
    //获取栈顶元素的值,且删除(出栈)
    bool Pop(PStack ps,int *rtval);
    
    //判空
    bool IsEmpty(PStack ps);
    
    //获取栈中有效元素的个数
    int GetLength(PStack ps);
    
    //清空所有的数据
    void Clear(PStack ps);
    
    //销毁
    void Destory(PStack ps);
  • .cpp

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include"stack.h"
    
    //初始化
    void InitStack(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return;
    	}
    	ps->base = (int*)malloc(INIT_SIZE * sizeof(int));
    	assert(ps->base != NULL);
    
    	ps->top = 0;//相当于空表
    	ps->stacksize = INIT_SIZE;
    	
    }
    
    static bool IsFull(PStack ps)//没有满的概念,一满就扩容
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return false;
    	}
        return ps->top == ps->stacksize;
    
    }
    
    static void Inc(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return;
    	}
    	ps->stacksize *= 2;//常用两倍或1.5倍
    	ps->base=(int*)realloc(ps->base, ps->stacksize * sizeof(int));
    	assert(ps->base != NULL);
    	//ps->top不用处理
    }
    
    //往栈中填入数据(入栈)
    bool Push(PStack ps, int val)//时间复杂度:O(1)
    {
    	//参数判断
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return false;
    	}
    
    	if (IsFull(ps))//判满
    	{
    		Inc(ps);//扩容
    	}
    	
    	//在表尾处插入,即入栈
    	ps->base[ps->top++] = val;
    	//ps->top++;
    
    	return true;
    }
    
    //获取栈顶元素的值,但不删除
    bool GetTop(PStack ps,int *rtval)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return false;
    	}
    	if (IsFull(ps))
    	{
    		return false;
    	}
    		
    	*rtval= ps->base[ps->top - 1];//输出参数
    	return true;
    }
    
    //获取栈顶元素的值,且删除(出栈)
    bool Pop(PStack ps, int* rtval)//时间复杂度:O(1)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return false;
    	}
    	if (IsFull(ps))
    	{
    		return false;
    	}
    	*rtval = ps->base[--ps->top];//前置--,这一步就是删除
    	//ps->top--;
    	return true;
        
    }
    
    //判空
    bool IsEmpty(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return false;
    	}
    	return ps->top == 0;
    }
    
    //获取栈中有效元素的个数
    int GetLength(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return 0;
    	}
    	return ps->top;//有效数据的个数
    	
    }
    
    //清空所有的数据
    void Clear(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return ;
    	}
    	 ps->top = 0;
    }
    
    //销毁
    void Destory(PStack ps)
    {
    	assert(ps != NULL);
    	if (ps == NULL)
    	{
    		return ;
    	}
    	free(ps->base);//释放动态内存
    	//置空
    	ps->base = NULL;
    	ps->top = 0;
    	ps->stacksize = 0;
    }
    
    
  • 测试文件.cpp

    #include"stack.h"
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
    	Stack s;
    	InitStack(&s);
    	for (int i = 0;i < 13;i++)
    	{
    		Push(&s, i);
    	}
    	int val;
    	if (GetTop(&s, &val))
    	{
    		printf("%d\n", val);
    	}
    
    	for (int i = 0;i < 20;i++)
    	{
    		if (Pop(&s, &val))
    		{
    			printf("%d", val);
    		}
    		else 
    		{
    			break;
    		}
    	}
    	Destory(&s);
    	
    	return 0;
    }

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sweep-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值