数据结构——栈

镇楼图

Pixiv:望月けい



〇、栈构建前的细节问题

采用顺序结构还是链式结构

实现的方式有所不同,如果是临时使用且不存在已造好的轮子的情况下,我建议直接顺序结构实现,而且空间要足够大,不存在满栈一说,越简单越好

由于栈本身操作受限,无论是顺序结构实现也好还是链式结构实现也好,之间的差别并不会特别影响时间复杂度

不过有一点要说明,在使用出栈时,顺序结构的栈并非真的删除了元素(其值还保留在原处),而链式结构的栈确确实实会删除元素

是否带头节点

在实现中,一般顺序结构不带头节点简化操作,而链式结构会带上头节点方便只有一个元素时删除


一、顺序栈

顺序栈的实现极其简单,只需要带上栈顶指针即可

typedef struct{
	int value;
}element,*Element;
typedef struct{
	Element data;//数组
    int top;//栈顶指针
    int len;//可容纳最大长度
}stack;

操作

(1)创建栈

void stack_create(stack &L,int length){
	L.data = (Element)malloc(sizeof(element)*length);
    L.top = 0;
    L.len = length;
}

(2)清空栈

void stack_clear(stack &L){
	L.top = 0;
}

(3)删除栈

void stack_delete(stack &L){
    realloc(L.data,0);
}

(4)判断是否空栈/满栈

bool stack_iffull(stack L){
	return (L.top == L.len) ? true : false ;
}
bool stack_ifempty(stack L){
	return (!L.top) ? true : false ;
}

(5)入栈

void stack_push(stack &L,element e){
    if(stack_iffull(L)){
		printf("错误:满栈\n");
        return;
    }
    L.data[L.top++] = e;
}

(5)出栈

element stack_pop(stack &L){
    if(stack_ifempty(L)){
		printf("错误:空栈\n");
        return L.data[L.top+1];
    }
    return L.data[--L.top];
}

注:请注意所使用的栈是否包含虚拟节点,以及入栈前后、出栈前后栈顶指针的关系

入栈具体操作细节:先将top指针向上移动,然后再插入数据

出栈具体操作细节:先返回结果,然后再将top指针向下移动


二、链栈

链栈与顺序栈大体相同,但由于是链式结构,因此不必考虑长度原因,基本也不用考虑满栈的情况

typedef struct{
	int value;
}element;
typedef struct __stacknode{
	element data;
    struct __stacknode *next;
}stacksize,*stack;

一般情况而言,为了方便实现,需要头指针

入栈时采用头插法,而出栈也只需要从头部删除即可

(1)创建栈

void stack_create(stack &L){
	L = (stack)malloc(sizeof(stacksize));
    L->next = NULL;
}

(2)清空栈

void stack_clear(stack &L){
	stack p1 = L,p2 = L->next;
    while(!p2){
		p1 = p2;
        p2 = p2->next;
        free(p1);
    }
}

(3)删除栈

void stack_delete(stack &L){
	stack_clear(L);
    free(L);
}

(4)判断是否空栈

bool stack_ifempty(stack &L){
    return (!L->next) ? true : false;
}

(5)入栈

void stack_push(stack &L,element e){
	stack newnode = (stack)malloc(sizeof(stacksize));
    newnode->data = e;
    newnode->next = L->next;
    L->next = newnode;
}

(6)出栈

element stack_pop(stack &L){
	if(stack_ifempty(L)){
        printf("错误:空栈\n");
        return L->data;
    }
    element e = L->next->data;
    stack p =L->next;
    L->next = L->next->next;
    free(p);
    return e;
}


参考教程

C语言技术网 数据结构

原文地址:https://www.cnblogs.com/AlienfronNova/p/15727329.html