栈的顺序存储结构

本文详细介绍了栈的线性实现方法,包括初始化、销毁、清空、判断空栈、获取栈长度、获取栈顶元素、插入和删除栈顶元素等核心操作。通过具体代码示例,展示了如何在C语言中实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.c文件
/***************************************
 * author:贺永虎
 * mail:xxxxxx
 * desc:栈的线性实现函数
 *
 * **************************************/
#include "SqStack.h"

/*
return:
	OK:表示初始化成功
	OVERFLOW:表示初始化失败,内存未开成功
parm:
	*S:表示要开辟的空间的线性表的地址

*/

int InitStack(SqStack *S)
{
    S->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if (!S->base)
        exit(OVERFLOW);//存储分配失败
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return OK;//存储分配成功
}
/*
return:
	无
parm:
	*S:要销毁的线性表

*/
void DestroyStack(SqStack *S)
{
    S->top = NULL;
    S->stacksize = 0;
    free(S->base);
}
/*
return:
	OK:表示清空栈成功
parm:
	*S:要清空栈
	
*/
int ClearStack(SqStack *S)
{
    S->top = S->base;
    return OK;
}
/*
return:
	ERROR:表示栈为空
	TURE:表示栈不为空
parm:
	*S:要判断栈是否为空

*/
int StackEmpty(SqStack *S)
{
    if (S->top == S->base)
        return ERROR;
    else
        return TRUE;
}
/*
return:
	FALSE:表示查询栈的长度失败
	否则 返回栈的长度
parm:
	*S:查询栈的长度

*/
int StackLength(SqStack *S)
{
    if (S->top == S->base)
        return FALSE;
    else
        return (S->top - S->base);
}
/*
return:
	FALSE:表示栈为空,没有栈顶元素
	TRUE:表示返回栈顶元素成功
parm:
	*S:要返回栈顶元素
	*e:表示栈顶元素
	
*/
int GetTop(SqStack *S, ElemType *e)
{
    if (S->top == S->base)
        return FALSE;
    else
        *e = *(S->top - 1);
    return TRUE;
}
/*
return:
	FALSE:表示插入元素e为新的栈顶元素失败
	OK:表示插入元素e为新的栈顶元素成功
parm:
	*S:要插入元素e为新的栈顶元素失败
	e:表示新插入栈顶的元素

*/
int Push(SqStack *S, ElemType e)
{
    if (S->top - S->base >= STACK_INIT_SIZE)//如果栈的长度超过最大栈长,重新开辟空间
    {
        S->base = (ElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(ElemType));
        if (!S->base)//如果开辟新空间失败,返回FALSE
        {
            return FALSE;
        }
        S->top = S->base + STACK_INIT_SIZE;
        S->stacksize = S->stacksize + STACKINCREMENT;
    }
    *(S->top) = e;
    (S->top)++;
    return OK;
}
/*
return:
	ERROR:表示栈为空,删除栈顶元素失败
	OK:表示返回栈顶元素成功
parm:
	*S:要删除栈顶元素
	*e:表示删除栈顶元素

*/
int Pop(SqStack *S, ElemType* e)
{
    if (S->top == S->base)
        return ERROR;
    else
    {
        S->top--;
        *e = *(S->top);
        return OK;
    }
}
/*
return:
	无
parm:
	*S:遍历栈中元素
*/

void StackTraverse(SqStack *S)
{
    if (S->base == NULL)
        printf("ERROR\n");
    if (S->top == S->base)
        printf("栈中没有元素!");
    ElemType *p;
    p = S->top;
    while (p > S->base)
    {
        p--;
        printf("%d ", *p);
    }
    printf("\n");
}
.h文件
#ifndef SqStack_H
#define SqStack_H

#include <stdio.h>
#include <stdlib.h>
//定义宏常量
#define  STACK_INIT_SIZE  100
#define  STACKINCREMENT    10

#define  TRUE  1
#define  FALSE 0
#define  OK    1
#define  ERROR 0
#define  INFEASIBLE -1
#define  OVERFLOW   -2

//设置两个数据类型
typedef  int  ElemType;

typedef struct SqStack{//栈的顺序结构表示
    ElemType *base; //栈底元素
    ElemType  *top; //栈顶元素
    int  stacksize; //栈的长度
}SqStack;

//如下为所有顺序表的函数声明

int InitStack(SqStack *S);//构造一个空栈S

void DestroyStack(SqStack *S);//销毁栈S,S不在存在

int ClearStack(SqStack *S);//清空栈S

int StackEmpty(SqStack *S);//判断栈S是否为空栈

int StackLength(SqStack *S);//求栈S的长度

int GetTop(SqStack *S, ElemType *e);//求栈顶元素

int Push(SqStack *S, ElemType e);//栈顶插入元素e

int Pop(SqStack *S, ElemType *e);//删除栈顶元素

void StackTraverse(SqStack *S);//遍历栈S


#endif // SqStack_H
main.c文件
#include "SqStack.h"

//如下为验证过程
void main()
{
    SqStack S;
    int stat = InitStack(&S);
    if (stat == OVERFLOW)
    {
        printf("init error\n");
    }
    StackTraverse(&S);

    Push(&S, 1);
    Push(&S, 2);
    Push(&S, 3);
    Push(&S, 4);
    Push(&S, 5);

    StackTraverse(&S);

    printf("栈的长度为:%d\n", StackLength(&S));

    int a;
    GetTop(&S, &a);
    printf("Top = %d\n", a);

    int b;
    Pop(&S, &b);

    GetTop(&S, &a);
    printf("Top = %d\n", a);

    StackTraverse(&S);

    if(StackEmpty(&S)) printf("栈不为空;\n");
    else printf("栈为空\n");

    ClearStack(&S);

    printf("栈的长度为:%d\n", StackLength(&S));

    if(StackEmpty(&S)) printf("栈不为空;\n");
    else printf("栈为空\n");
	
}
makefile文件

main:main.o SqStack.o
	gcc -g main.o SqStack.o -o main
main.o:main.c SqStack.h
	gcc -g -c main.c -o main.o
SqStack.o:SqStack.c SqStack.h
	gcc -g -c SqStack.c -o SqStack.o
    
clean:
	rm -fr *.o
	rm -fr main

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值