这篇文章主要为大家介绍了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语言之堆栈


猜你喜欢
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Easyx实现扫雷游戏 2023-02-06
- C语言qsort()函数的使用方法详解 2023-04-26
- C语言详解float类型在内存中的存储方式 2023-03-27
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Qt计时器使用方法详解 2023-05-30