详解C语言之堆栈

一、何为堆栈?

a.堆栈是一种特殊的线性表

b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表

c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底

d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈

堆栈

二、思维导图

堆栈

三、代码

1、顺序堆栈

#include <stdio.h>

typedef int DataType;

#define MaxStackSize 64

typedef struct

{

DataType stack[MaxStackSize];

int top;

}SeqStack;

//初始化

void StackInit(SeqStack *S)

{

S->top = 0;

}

//判断是否栈空

int StackIsEmpty(SeqStack S)

{

if (S.top <= 0)

return 0;

else

return 1;

}

//入栈

int StackPush(SeqStack *S, DataType x)

{

if (S->top >= MaxStackSize)

{

printf("栈满,无法进栈!!!\n");

return 0;

}

else

{

S->stack[S->top] = x;

S->top++;

return 1;

}

}

//出栈

int StackPop(SeqStack *S, DataType *x)

{

if (S->top <= 0)

{

printf("堆栈已空,无法出栈!!!\n");

return 0;

}

else

{

S->top--;

*x = S->stack[S->top];

return 1;

}

}

//获取栈顶元素

int StackGetTop(SeqStack S, DataType *x)

{

if (S.top <= 0)

{

printf("堆栈已空!!!\n");

return 0;

}

else

{

*x = S.stack[S.top - 1];

return 1;

}

}

int main()

{

SeqStack myStack;

int i, x;

StackInit(&myStack);

for (i = 0; i < 10; i++)

StackPush(&myStack, i + 1);

StackGetTop(myStack, &x);

printf("当前栈顶元素为:%d\n", x);

printf("依次出栈:");

while (StackIsEmpty(myStack))

{

StackPop(&myStack, &x);

printf("%d ", x);

}

system("pause");

return 0;

}

2、链式堆栈

#include <stdio.h>

#include <stdlib.h>

typedef int DataType;

typedef struct snode

{

DataType data;

struct snode *next;

}LSNode;

//初始化

void StackInit(LSNode **top)

{

*top = (LSNode *)malloc(sizeof(LSNode));

(*top)->next = NULL;

}

//判断堆栈是否非空

int StackIsEmpty(LSNode *top)

{

if (top->next == NULL)

return 0;

else

return 1;

}

//入栈

void StackPush(LSNode *top, DataType x)

{

LSNode *p;

p = (LSNode *)malloc(sizeof(LSNode));

p->data = x;

p->next = top->next;

top->next = p;

}

//出栈

int StackPop(LSNode *top, DataType *x)

{

LSNode *p = top->next;

if (p == NULL)

{

printf("堆栈已空,删除错误!!!\n");

return 0;

}

top->next = p->next;

*x = p->data;

free(p);

return 1;

}

//获取栈顶元素

int StackGetTop(LSNode *top, DataType *x)

{

LSNode *p = top->next;

if (p == NULL)

{

printf("堆栈已空,取出错误!!!\n");

return 0;

}

*x = p->data;

return 1;

}

//释放内存空间

void StackDestroy(LSNode **top)

{

LSNode *p, *q;

p = *top;

while (p != NULL)

{

q = p;

p = p->next;

free(q);

}

*top = NULL;

}

int main()

{

int i, x;

LSNode *top;

StackInit(&top);

for (i = 0; i < 10; i++)

StackPush(top, i + 1);

StackGetTop(top, &x);

printf("当前栈顶元素为%d\n", x);

printf("依次出栈:");

while (StackIsEmpty(top))

{

StackPop(top, &x);

printf("%4d", x);

}

StackDestroy(&top);

system("pause");

return 0;

}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

以上是 详解C语言之堆栈 的全部内容, 来源链接: utcz.com/p/247658.html

回到顶部