【数据结构】栈的顺序存储结构 C语言实现

  • 栈(stack),是一种线性存储结构,它有以下几个特点: 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。 向栈中添加/删除数据时,只能从栈顶进行操作。
  • 栈的基本操作
基本操作
initStack(&S)
clearStack(&S)
getLength(&S)
pushStack(&S, e)
stackTraverse(S, visit())
destroyStack(&S)
isStackEmpty(&S)
getTop(S, &e)
popStack(&S, &e)

实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define status int
#define INIT_SIZE 100
#define INCRE_SIZE 10

typedef int elem;

/*		顺序栈
栈顶指针(top)栈底指针(base)
后进先出(last in first out)LIFO
*/
typedef struct {
	elem *top;
	elem *base;
	int stacksize;
}SqStack;

status initStack(SqStack * stack)
{
	stack->base = (elem *)malloc(INIT_SIZE * sizeof(elem));
	if(!stack->base) exit(-2);
	stack->top = stack->base;
	stack->stacksize = INIT_SIZE;
    printf("STACK---INIT---SUCCESS\n\n");
	return 1;
}


int isStackEmpty(SqStack *stack)
{
	if(stack->top == stack->base) return 1;
    return 0;
}

status pushStack(SqStack *stack, elem e)
{
	if(stack->top - stack->base >= stack->stacksize){
		stack->base = (elem *)realloc(stack->base ,(stack->stacksize + INCRE_SIZE) * sizeof(elem));
		if(!stack->base)	exit(-2);
		printf("STACK---PUSH---SUCCESS\n\n");
		stack->top = stack->base + stack->stacksize;
		stack->stacksize += INCRE_SIZE;
	}
	*stack->top++ = e;

	return 1;
}

status getTop(SqStack *stack, elem *e)
{
	if(stack->top == stack->base){
		printf("空栈");
		return 0;
	}
	//改变e的值
	*e = *(stack->top-1);
	//返回栈顶元素
	return 1;
}
//pop删除S的栈顶元素,并用e放回其值
status popStack(SqStack *stack, elem * e)
{
    if(!isStackEmpty(stack)){
        *e = *(--stack->top);
    }
    return 1;
}

//返回栈的长度
status getlength(SqStack *stack)
{
    return stack->top - stack->base;
}

status clearStack(SqStack *stack)
{
    stack->top = stack->base;
	return 1;
}

//销毁栈
status destoryStack(SqStack *stack)
{
    if(!stack->base)
        free(stack->base);
    return 1;
}

//对每一个站内元素调用一个函数
status stackTraverse(SqStack *stack, void visit())
{
    if(!isStackEmpty(stack)){
        elem *traver = stack->top;
        while(stack->base == stack->top--){
            visit(*stack->top);
        }
        stack->top = stack->base + getlength(stack);
    }


    return 1;
}

int main(int argc, char *argv[]) {
	SqStack stack;
	initStack(&stack);      //初始化栈

	for(int i = 0; i < 101; i++){
        pushStack(&stack, i);   //入栈
	}
    printf("length = %d\n", getlength(&stack));
    for(int j = 0; j < 101; j++){
        int e;
        popStack(&stack, &e);  //出栈
        printf("%d\t", e);
    }
    printf("\n");

    if(isStackEmpty(&stack))
        printf("Stack Empty!\n");
    else
        printf("Stack is not Empty!\n");

    printf("length = %d\n", getlength(&stack));

	clearStack(&stack);     //清空栈

//  destoryStack(&stack);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40311709/article/details/83115312