栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 栈的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 栈的实现

s一个栈一共有四个功能:

`入栈(英文名:push)
·判(栈)满(isFull)
·出栈(pop)
·判(栈)空(isEmpty)
栈的C语言定义(结构体)
1.顺序存储的数组,
优点: 节省空间, 操作简单,学习成本较低,易于理解.
缺点: 栈的大小一开始就声明’死’了,不利于使用.
2.非顺序存储的链表.
优缺点:与数组栈正好相反.

数组栈
数组栈,顾名思义,就是基于数组的栈,也是说把一个数组的强大的下标功能阉割掉,并且只能从一头进入(数组头明显更为方便)
所以结构体为:
(为了方便学习,存储类型统一使用int,但是我们一般更习惯在头文件下面给int 起一个别名,原因很简单:这样就这样实现简单的多态,需要将int类型栈改成char类型栈时,只需要改定义的别名中的类型即可)
 

typedef struct
{
    int Data[MaxSize];   // 存储元素的数组
    int topIdx;       //栈顶指针
}SeqStack;

栈的四个基本操作定义:

//return 0 为false,1为true(下同)
// 将元素推入栈中
int Push(SeqStack &L, int e)
{ // 栈已满
	if(L.topIdx==MaxSize -1)
    {
        return 0;
    }
    // 加入栈中
    L.Data[L.topIdx++] = e;
    // 返回自身
    return e;
}
// 移除栈顶元素
int Pop(SeqStack &L)
{	// 栈空
     if(L.topIdx == 0)
    {
         //返回失败
         return 0;
    }
    // 打印并返回栈
    int val = L.Data[--L.topIdx];
    printf("%d ",val);
    return val;
}
//判断栈s是否为空
int isEmpty(SeqStack s)
{
    // 如果下标在0,说明栈中无元素
    if(s.topIdx != 0)
    {
        return 1;
    }
    return 0;
}
// 判断栈是否已栈.
Status isFull(SeqStack s)
{
    // 已满返回true(1)
    if(s.topIdx != MaxSize -1)//之前的定义数组的最大值的下标
    {
        return 1;
    }
    return 0;
}

顺序栈 

#include
#include

#define STACK_INIT_SIZE 100
#define STACKINCRMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef int SElemType;

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

//初始化栈
Status InitStack(SqStack *S)
{
    S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base)
        exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return OK;
}

//返回栈顶元素
Status GetTop(SqStack *S, SElemType *e)
{
    if(S->top == S->base)
        return ERROR;
    *e = *(S->top - 1);
    return OK;
}

//元素入栈
Status Push(SqStack *S, SElemType e)
{
    if(S->top - S->base >= S->stacksize)
    {
        S->base = (SElemType *)realloc(S->base,(S->stacksize + STACKINCRMENT) * sizeof(SElemType));
        if(!S->base)
            exit(OVERFLOW);
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCRMENT;
    }
    *S->top++ = e;
    return OK;
}

//删除栈顶元素
Status Pop(SqStack *S, SElemType *e)
{
    if(S->top == S->base)
        return ERROR;
    *e = *--S->top;
    return OK;
}

//清空栈中的元素
Status ClearStack(SqStack *S)
{
    S->top = S->base;
    return OK;
}


//销毁栈
Status DestoryStack(SqStack *S)
{
    S->top = S->base;
    free(S->base);
    S->top = NULL;
    S->base = NULL;
    return OK;
}

void main()
{

}

转载:栈(stack) C语言实现 详解_过道-CSDN博客_c语言栈

           栈(stack) C语言实现 详解 - 过道 - 博客园

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号