中国建设银行报名网站,要进一步增强门户网站建设合力,站酷设计网站官网入口免费,辽宁同鑫建设有限公司网站提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言
栈#xff08;Stack#xff09;是计算机科学中一种常见的数据结构#xff0c;它是… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言
栈Stack是计算机科学中一种常见的数据结构它是一种线性数据结构具有特定的添加和删除元素的方式遵循先进后出Last In, First OutLIFO原则。栈通常用于管理函数调用、表达式求值、内存管理等多个计算机科学领域。 提示以下是本篇文章正文内容下面案例可供参考
一、栈
栈是一种特殊的线性表只允许在固定的一端进行插入和删除元素操作进行数据插入和删除操作的一端称为栈顶另一端称为栈底。栈中的数据元素遵守**先进后出LIFO(Last In First Out)**的原则。 压栈栈的插入操作叫做进行入栈、进栈、压栈入数据在栈顶 出栈栈的删除操作叫做出栈出数据也在栈顶。 栈的实现一般可以使用数组或者链表相对而言数组的结构实现更优一些因为数组在尾上插数据的代价比较小。
二、C语言实现
1.声明代码
代码如下示例
#pragma once
#include stdio.h
#include stdlib.h
#include stdbool.h
#include assert.htypedef int STDatatype;
// 数组栈数组尾部为栈顶数组头为栈底typedef struct Stack
{STDatatype* a;int capacity;int top;
}ST;void StackInit(ST* ps); //初始化栈
void StackDestroy(ST* ps); // 销毁栈
void StackPush(ST* ps, STDatatype x); //入栈
void StackPop(ST* ps); //出栈
STDatatype StackTop(ST* ps); //获取栈顶元素 bool StackEmpty(ST* ps); // 判断栈是否为空
int StackSize(ST* ps); //栈中元素个数2.实现增删查改代码
代码如下示例
#include Stack.hvoid StackInit(ST* ps)
{assert(ps); //断言检查ps-a (ST*)malloc(sizeof(ST) * 4); //开辟空间if (ps-a NULL) //空间申请失败{perror(malloc fail....);exit(-1);}ps-capacity 0;ps-top 0;
}void StackDestroy(ST* ps)
{assert(ps);free(ps); //释放空间ps-a NULL;ps-capacity 0;ps-top 0;
}void StackPush(ST* ps, STDatatype x) //入栈
{assert(ps);if (ps-top1 ps-capacity) // 如果空间已经满了{STDatatype* tmp (STDatatype*)realloc(ps-a, ps-capacity * 2 * sizeof(STDatatype)); //扩容if (ps-a NULL){perror(malloc fail...);exit(-1);}ps-a tmp; //ps要指向新开辟的空间tmpps-capacity * 2; // ps的容量变为原来的2倍}ps-top;ps-a[ps-top] x;
}void StackPop(ST* ps) //出栈
{assert(ps);ps-top--; //指针前移
}STDatatype StackTop(ST* ps) //获取栈顶元素
{assert(ps);assert(!StackEmpty(ps)); //断言栈不为空return ps-a[ps-top-1]; //注意栈顶元素为top的前一个元素
}bool StackEmpty(ST* ps) // 判断栈是否为空
{assert(ps);if (ps-top 0){return true;}else{return false;}
}int StackSize(ST* ps) //栈中元素个数
{assert(ps);return ps-top; //top为最后一个数据的下一个位置
}3.测试代码
代码如下示例
#include Stack.h//栈的实现一般可以使用数组或者链表相对而言数组的结构实现更优一些
// 因为数组在尾上插数据的代价比较小。void Stack_Test1()
{ST st;StackInit(st); //初始化结构体要把结构体的地址传过去StackPush(st, 1);StackPush(st, 2);StackPush(st, 3);StackPush(st, 4);StackPush(st, 5);int size StackSize(st);printf(sts size:%d, size);StackDestroy(st);}int main()
{Stack_Test1();return 0;
}总结
栈适用于需要后进先出操作的情况例如函数调用和操作历史记录。