栈(stack)是一个特殊的线性表,是限定在一端(通常是表尾)进行插入和删除操作的线性表
表尾称为栈顶表头称为栈底(Base),基本操作为PUSH(入栈),POP(出栈).

特点是**LIFO(Last In First out)后进先出,**在进行PUSH和POP操作的时候也是要这个模式进行访问。

对于顺序栈而言,栈的存储方式与一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,栈底一般在地地址端,附设top指针,指示栈顶元素在顺序栈的位置,另设base指针,指示栈底元素在顺序栈中的位置。
但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址,用stacksize来指示栈课使用的最大容量。
空栈的标志是base==top也就是栈顶和栈底重合,不存储任何数据。
栈满的标志是top-base==stacksize
上溢(overflow):栈已经满,又要压入元素
下溢(underflow):栈已经空,又要弹出元素
上溢是一种错误,使问题的处理无法进行,而下溢一般认为是一种结束条件,也就是问题的处理结束

栈的基本表现

struct SqStack
{SElemType *base; // 在栈构造之前和销毁之后,base的值为NULLSElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈

栈的基本操作函数及其实现:
①nitStack(&S)初始化一个栈

Status InitStack(SqStack &S)
{
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZES.base= new SElemType[STACK_INIT_SIZE];if(!S.base)//如果分配失败了{exit(ERROR);}S.top=S.base;S.stacksize=STACK_INIT_SIZE;}

②DestoryStack(&S)销毁一个栈

Status DestoryStack(SqStack &S)
{if(S.base){delete S.base;//释放内存S.stacksize=0;S.base=S.top=NULL;//重置栈顶和栈底指针值}return OK;
}

③StackEmpty(S)判断一个栈是否为空

Status StackEmpty(Sqstack S)
{if(S.top==S.base){return OK;}else{return ERROR;}
}

④StackLength(S)计算一个栈的长度

int StackLength(SqStack S)
{// 返回栈S的元素个数return S.top-S.base;
}

⑤GetTop(S,&e)获取栈顶元素

Status GetTop(SqStack S,SElemType &e)
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base){return ERROR;}e=*S.top;return OK;
}

⑥ClearStack(&S)清空栈**

Status ClearStack(SqStack &S)
{if(S.base){S.top=S.base;}return OK;
}

⑦Push(&S,e)入栈操作

Status Push(SqStack &S,SElemType e)
{// 在栈S中插入元素e为新的栈顶元素
/*判断栈是否满*/
/*压入元素e*/
/*栈顶指针++*/if(S.top-S.base==S.stacksize){return ERROR;}*S.top=e;S.top++;return OK;
}

⑧Pop(&S,e)出栈操作

Status Pop(SqStack &S,SElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base){return ERROR;}--S.top;e=*S.top;return OK;
}

⑨取得栈顶元素

Status GetTop(SqStack S,SElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base){return ERROR;}S.top--;e=*S.top;S.top++;return OK;
}

⑩遍历栈并打印

Status StackTraverse(SqStack S)
{// 从栈顶到栈底依次输出栈中的每个元素SElemType *p = (SElemType *)malloc(sizeof(SElemType));p =S.top;    //请填空if(p==S.base)printf("The Stack is Empty!"); //请填空else{printf("The Stack is: ");p--;while(p+1!=S.base)            //请填空{printf("%d ", *p);p--;}}printf("\n");return OK;
}

完整代码如下

#include<malloc.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等struct SqStack
{SElemType *base; // 在栈构造之前和销毁之后,base的值为NULLSElemType *top; // 栈顶指针int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈Status InitStack(SqStack &S)
{// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZES.base= new SElemType[STACK_INIT_SIZE];if(!S.base)//如果分配失败了{return ERROR;}S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}Status Push(SqStack &S,SElemType e)
{// 在栈S中插入元素e为新的栈顶元素
/*判断栈是否满*/
/*压入元素e*/
/*栈顶指针++*/if(S.top-S.base==S.stacksize){return ERROR;}*S.top=e;S.top++;return OK;
}Status Pop(SqStack &S,SElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base){return ERROR;}--S.top;e=*S.top;return OK;
}Status GetTop(SqStack S,SElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base){return ERROR;}S.top--;e=*S.top;S.top++;return OK;
}int StackLength(SqStack S)
{// 返回栈S的元素个数return S.top-S.base;
}Status ClearStack(SqStack &S)
{if(S.base){S.top=S.base;}return OK;
}Status StackTraverse(SqStack S)
{// 从栈顶到栈底依次输出栈中的每个元素SElemType *p = (SElemType *)malloc(sizeof(SElemType));p =S.top;    //请填空if(p==S.base)printf("The Stack is Empty!"); //请填空else{printf("The Stack is: ");p--;while(p+1!=S.base)            //请填空{printf("%d ", *p);p--;}}printf("\n");return OK;
}Status StackEmpty(SqStack S)
{if(S.top==S.base){return OK;}else{return ERROR;}
}Status DestoryStack(SqStack &S)
{if(S.base){delete S.base;//释放内存S.stacksize=0;S.base=S.top=NULL;//重置栈顶和栈底指针值}return OK;
}int main()
{int a;SqStack S;
SElemType x, e;if(InitStack(S))    // 判断顺序表是否创建成功,请填空
{printf("A Stack Has Created.\n");
}
while(1){printf("1:Push \n2:Pop \n3:Get the Top \n4:Return the Length of the Stack\n5:Load the Stack\n0:Exit\nPlease choose:\n");scanf("%d",&a);switch(a){case 1: scanf("%d", &x);if(!Push(S,x)) printf("Push Error!\n"); // 判断Push是否合法,请填空else printf("The Element %d is Successfully Pushed!\n", x);break;case 2: if(!Pop(S,e)) printf("Pop Error!\n"); // 判断Pop是否合法,请填空else printf("The Element %d is Successfully Poped!\n", e);break;case 3: if(!GetTop(S,e))printf("Get Top Error!\n"); // 判断Get Top是否合法,请填空else printf("The Top Element is %d!\n", e);break;case 4: printf("The Length of the Stack is %d!\n",StackLength(S)); //请填空break;case 5:StackTraverse(S);break;case 0: return 1;}}
}

栈的特点及其基本操作相关推荐

  1. java栈和队列验证回文串_栈和队列的基本操作及其应用(回文判断)

    实验二栈和队列的基本操作及其应用 一.实验目的 1.掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用. 2.掌握栈和队列的特点,即后进先出和先进先出的原则. 3.掌握栈和队列的基本运算, ...

  2. 数据结构[栈与队列]的基本操作

    首先大致说一下栈这个数据结构,他是一个先进后出的结构,就好比家中摆盘子一样,洗好的盘子放到最上面,当要用的时候从最上面拿走(当然只是一般情况,你要是每次都从下面抽走盘子我也没办法). 这样的话我们可以 ...

  3. 栈的基础与基本操作实现

    文章目录 一.栈(后进先出,LIFO表) 二.栈的用途 三.栈的表示和实现 1.栈的顺序存储 (1)顺序栈 (2)顺序栈上的基本操作实现 ①初始化栈S(创建一个空栈S) ②获取栈顶元素 ③进栈(在栈顶 ...

  4. 魔王语言C语言 使用头文件封装 链表链栈顺序队列的基本操作

    1.抽象数据类型的定义和说明: a) 链栈类型 由于沿用了链表,因此此处列出修改后的链表抽象数据类型 SElemType:数据结点,内含一个char型的数据zi; SqStack:栈,包含存储空间基址 ...

  5. 实验四 栈和队列的基本操作

    (1)采用链式存储实现栈的初始化.入栈.出栈操作. (2)采用顺序存储实现栈的初始化.入栈.出栈操作. (3)采用链式存储实现队列的初始化.入队.出队操作. (4)采用顺序存储实现循环队列的初始化.入 ...

  6. 栈和队列的基本操作(栈和队列的区别)

    数据结构中的栈与内存中的栈的不同 一.数据结构中的堆栈 在数据结构中的堆栈,实际上堆栈是两种数据结构:堆和栈.堆和栈都是一种数据项按序排列的数据结构. 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉 ...

  7. python 顺序栈及基本操作

    顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序表模拟栈以及实现对栈中数 ...

  8. 利用栈的基本操作,将十进制数转换为八进制数

    #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define STACKSIZE 100 t ...

  9. java顺序栈_顺序栈的基本操作(入栈和出栈)

    顺序栈的基本操作(入栈和出栈) 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如何使用顺序 ...

  10. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武

    本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...

最新文章

  1. Python Django jsonpickle序列化部分字段
  2. 完成登录并生成JWT
  3. strip python里面是什么意思_python中的strip是什么意思
  4. mysql for centos_CentOs中mysql的安装与配置
  5. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_2_方法引用_通过对象名引用成员方法...
  6. adb shell 执行sh脚本_Shell命令脚本初步认识,Shell脚本入门
  7. 【教程】Edraw Max(亿图图示):使用免费模板和示例快速制作发票
  8. win10怎么设置锁定计算机,win10电脑自动锁屏怎么设置_让win10电脑自动锁屏的设置方法...
  9. C语言程序的基本,C语言编程基础知识汇总学习,适合初学者!
  10. D. Berserk And Fireball(Educational Codeforces Round 91 (Rated for Div. 2))
  11. gitter 卸载_最佳Gitter渠道:硬件,物联网和机器人技术
  12. win 10 显示未识别网络的 一种解决办法
  13. 如何转让个人股权?个人股权转让流程
  14. 【游戏】2048及各种变种大集合汇总【更新ing~新版Floppy2048 - 恒星聚变版 - 恶搞改数据】...
  15. Oracle 报错 28000原因和解决方法
  16. xftp本地同步到服务器文件夹,如何停止Xftp更新和同步浏览服务器?
  17. 三生诀游戏服务器维护,《三生诀》7月26日更新公告
  18. vue canvas手绘签名
  19. 纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】...
  20. 扇形束CT重建快速生成系统矩阵(system matrix)的Python实现

热门文章

  1. spring学习8之JDBC的CRUD
  2. apple 关闭双重认证_如何在Apple Mail中关闭联系人和事件建议
  3. PHILIPS>飞利浦>HX9352>电动牙刷>拆解+维修记录
  4. 计算机课做名片怎么做,小学信息技术名片DIY教案设计
  5. VUE小需求——旋转小图标
  6. 项目管理四要素是什么?
  7. 如何设计出一个比较合理的数据归档系统
  8. Distance from a point to a hyperplane
  9. MG513P30 12V直流减速电机编码器电线与杜邦线焊接教程
  10. 【转】找工时间线和心得