本文章会详细介绍栈的基本操作

目录

1.本文章中全部实现的功能

2.建栈

3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)

4.进栈

5.弹栈,并且返回出弹栈元素

6.栈内元素的个数

7.按栈输入的顺序输出栈里面的值

8.按栈弹出的顺序输出栈

9.判断栈是否为空

10.获取栈顶元素

11.清空一个栈

12.摧毁一个栈

13.switch功能语句

14.全部代码

15.运行结果


1.本文章中全部实现的功能

栈的特点,先进后出。

void program()
{printf("\t请输入以下功能数字\n");printf("\t0.退出\n");printf("\t1.判断栈是否为空\n");printf("\t2.按栈弹出的顺序输出栈\n");printf("\t3.按栈输入的顺序输出栈里面的值\n");printf("\t4.获取栈顶元素\n");printf("\t5.摧毁一个栈\n");printf("\t6.清空一个栈\n");printf("\t7.求栈的长度\n");printf("\t8.弹栈,并且返回出弹栈元素\n");printf("\t9.输入栈内数据\n");printf("\t10.在清空的基础下重新建立栈\n");printf("\t11.请输入想要插入栈顶的元素\n");}

2.建栈

Status InitStack(SqStack &S)
{//建栈S.base=(int*)malloc(Stack_Init_Size*sizeof(int));if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=Stack_Init_Size;return OK;
}

3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)

SqStack InputStack(SqStack &S)
{   int a;/*scanf("%d",&a);while(a!=-1){   if(S->top-S->base>S->stacksize){S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));if(!S->base) printf("NoRealloc\n");S->top=S->base+S->stacksize;S->stacksize=S->stacksize+Stack_Increment;}*S->top++ = a;scanf("%d",&a);}*/InitStack(S);printf("\t");for(int i=0;;i++){scanf("%d",&a);if(a==-1)break;*S.top++ =a;}printf("\t写入完成\n");
}

4.进栈

如果栈的内容小于输入内容不需要扩展直接*S.top++=e;但是当内容大于了栈的内容。就进入if语句。

Status Push(SqStack &S,int e)
{//进栈if(S.top-S.base>S.stacksize){S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));if(!S.base) printf("NoRealloc\n");S.top=S.base+S.stacksize;S.stacksize=S.stacksize+Stack_Increment;}*S.top++=e;return OK;
}

5.弹栈,并且返回出弹栈元素

Status Pop(SqStack &S,int *e)
{   //弹栈,并且返回出弹栈元素*e=*--S.top;return OK;
}

6.栈内元素的个数

Status StackLength(SqStack S)
{   //栈长int Length=S.top-S.base;printf("\tlength = %d\n",Length);return Length;
}

7.按栈输入的顺序输出栈里面的值

void PrintStack_int(SqStack S)
{//按栈输入的顺序输出栈里面的值int *p=S.base;while(p!=S.top){   printf("\t");printf(" %d ",*p);p++;}printf("\n");
}

8.按栈弹出的顺序输出栈

void PrintStack_Pop(SqStack S)
{   //按栈弹出的顺序输出栈int *p=S.top-1;while(p!=S.base-1){   printf("\t");printf(" %d ",*p);p--;}printf("\n");
}

9.判断栈是否为空

void IsNullStack(SqStack S)
{//判断栈是否为空if(S.base==S.top||S.base==NULL)printf("\t栈为空栈\n");else printf("\t栈不为空\n");
}

10.获取栈顶元素

Status GetTop(SqStack S)
{   //获取栈顶元素int e;e=*(S.top-1);printf("\t栈顶元素为%d\n",e);
}

11.清空一个栈

void ClearStack(SqStack &S)
{   //清空一个栈    S.top=S.base;
}

12.摧毁一个栈

void DestroyStack(SqStack &S)
{  //摧毁一个栈free(S.base);S.base=S.top;S.stacksize=0;S.top=NULL;S.base=NULL;
} 

13.switch功能语句

void swi(SqStack S){int num;program();printf("\t输入的元素是:");scanf("%d",&num);printf("\n\n");while(num){   switch(num){case 0:num=0;break;case 1:if(S.base==NULL){printf("\t在进行操作1之前需要操作功能9\n");}else{printf("\t判断栈是否为空\n");IsNullStack(S);}break;case 2:if(S.base==NULL){printf("\t在进行操作2之前需要操作功能9\n");}else{printf("\t2.按栈弹出的顺序输出栈\n");PrintStack_Pop(S);}break;case 3:if(S.base==NULL){printf("\t在进行操作3之前需要操作功能9\n");}else{printf("\t3.按栈输入的顺序输出栈里面的值\n");PrintStack_int(S);}break;case 4:if(S.base==NULL){printf("\t在进行操作4之前需要操作功能9\n");}else{printf("\t4.获取栈顶元素\n");GetTop(S);}break;case 5:if(S.base==NULL){printf("\t在进行操作5之前需要操作功能9\n");}else{printf("\t5.摧毁一个栈\n");DestroyStack(S);printf("\t栈已经被摧毁\n");}break;case 6:if(S.base==NULL){printf("\t在进行操作6之前需要操作功能9\n");}else{printf("\t6.清空一个栈\n");ClearStack(S);printf("\t栈已经清空");}break;case 7:if(S.base==NULL){printf("\t在进行操作7之前需要操作功能9\n");}else{printf("\t7.求栈的长度\n");StackLength(S);}break;case 8:if(S.base==NULL){printf("\t在进行操作8之前需要操作功能9\n");}else{printf("\t弹栈,并且返回出弹栈元素\n");int a;Pop(S,&a);printf("\t8.弹栈弹出的元素是%d\n",a);}break;case 9:printf("\t9.输入栈内数据\n");InputStack(S);break;case 10:if(S.base==NULL){printf("\t在进行操作10之前需要操作功能9\n");}else{printf("\t10.在清空的基础下重新建立栈\n");DestroyStack(S);printf("\t请重新输入栈内数据\n");InputStack(S);}break;case 11:if(S.base==NULL){printf("\t在进行操作11之前需要操作功能9\n");}else{printf("\t11.在栈顶插入元素\n");int x;printf("\t请输入想要插入栈顶的元素:\n");scanf("%d",&x);Push(S,x);printf("\t插入完成\n");}break;default:printf("输入有误,请重新输入\n");}printf("\n\n\n");program();printf("\t输入的元素是:");scanf("%d",&num);printf("\n\n");}
}

14.全部代码

//define区
#define Stack_Init_Size 100
#define Stack_Increment 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0//预处理指令区
#include<stdio.h>
#include<stdlib.h>//typedef
typedef int Status;
typedef struct {int *base;int *top;int stacksize;
}SqStack;Status InitStack(SqStack &S);       //建栈
SqStack InputStack(SqStack &S);     //输入栈内元素
Status Push(SqStack &S,int e);      //进栈
Status Pop(SqStack &S,int *e);      //弹栈,并且返回出弹栈元素
Status StackLength(SqStack S);      //栈内元素的个数
void PrintStack_int(SqStack S);     //按栈输入的顺序输出栈里面的值
void PrintStack_Pop(SqStack S);     //按弹栈顺序输出栈里面的值
void IsNullStack(SqStack S);        //判断是否为空栈
Status GetTop(SqStack S);           //获取栈顶元素
void ClearStack(SqStack &S);        //清空栈
void DestroyStack(SqStack &S);      //摧毁栈
void program();                     //功能函数
void swi(SqStack S);                //switchint main()
{SqStack S;S.base=NULL;swi(S);printf("\t程序退出了,下次见\n");
}Status InitStack(SqStack &S)
{//建栈S.base=(int*)malloc(Stack_Init_Size*sizeof(int));if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=Stack_Init_Size;return OK;
}SqStack InputStack(SqStack &S)
{   int a;/*scanf("%d",&a);while(a!=-1){   if(S->top-S->base>S->stacksize){S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));if(!S->base) printf("NoRealloc\n");S->top=S->base+S->stacksize;S->stacksize=S->stacksize+Stack_Increment;}*S->top++ = a;scanf("%d",&a);}*/InitStack(S);printf("\t");for(int i=0;;i++){scanf("%d",&a);if(a==-1)break;*S.top++ =a;}printf("\t写入完成\n");
}Status Push(SqStack &S,int e)
{//进栈if(S.top-S.base>S.stacksize){S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));if(!S.base) printf("NoRealloc\n");S.top=S.base+S.stacksize;S.stacksize=S.stacksize+Stack_Increment;}*S.top++=e;return OK;
}Status Pop(SqStack &S,int *e)
{   //弹栈,并且返回出弹栈元素*e=*--S.top;return OK;
}Status StackLength(SqStack S)
{   //栈长int Length=S.top-S.base;printf("\tlength = %d\n",Length);return Length;
}void PrintStack_int(SqStack S)
{//按栈输入的顺序输出栈里面的值int *p=S.base;while(p!=S.top){   printf("\t");printf(" %d ",*p);p++;}printf("\n");
}void PrintStack_Pop(SqStack S)
{   //按栈弹出的顺序输出栈int *p=S.top-1;while(p!=S.base-1){   printf("\t");printf(" %d ",*p);p--;}printf("\n");
}void IsNullStack(SqStack S)
{//判断栈是否为空if(S.base==S.top||S.base==NULL)printf("\t栈为空栈\n");else printf("\t栈不为空\n");
}Status GetTop(SqStack S)
{   //获取栈顶元素int e;e=*(S.top-1);printf("\t栈顶元素为%d\n",e);
}void ClearStack(SqStack &S)
{   //清空一个栈    S.top=S.base;
}void DestroyStack(SqStack &S)
{  //摧毁一个栈free(S.base);S.base=S.top;S.stacksize=0;S.top=NULL;S.base=NULL;
} void program()
{printf("\t请输入以下功能数字\n");printf("\t0.退出\n");printf("\t1.判断栈是否为空\n");printf("\t2.按栈弹出的顺序输出栈\n");printf("\t3.按栈输入的顺序输出栈里面的值\n");printf("\t4.获取栈顶元素\n");printf("\t5.摧毁一个栈\n");printf("\t6.清空一个栈\n");printf("\t7.求栈的长度\n");printf("\t8.弹栈,并且返回出弹栈元素\n");printf("\t9.输入栈内数据\n");printf("\t10.在清空的基础下重新建立栈\n");printf("\t11.请输入想要插入栈顶的元素\n");}void swi(SqStack S){int num;program();printf("\t输入的元素是:");scanf("%d",&num);printf("\n\n");while(num){   switch(num){case 0:num=0;break;case 1:if(S.base==NULL){printf("\t在进行操作1之前需要操作功能9\n");}else{printf("\t判断栈是否为空\n");IsNullStack(S);}break;case 2:if(S.base==NULL){printf("\t在进行操作2之前需要操作功能9\n");}else{printf("\t2.按栈弹出的顺序输出栈\n");PrintStack_Pop(S);}break;case 3:if(S.base==NULL){printf("\t在进行操作3之前需要操作功能9\n");}else{printf("\t3.按栈输入的顺序输出栈里面的值\n");PrintStack_int(S);}break;case 4:if(S.base==NULL){printf("\t在进行操作4之前需要操作功能9\n");}else{printf("\t4.获取栈顶元素\n");GetTop(S);}break;case 5:if(S.base==NULL){printf("\t在进行操作5之前需要操作功能9\n");}else{printf("\t5.摧毁一个栈\n");DestroyStack(S);printf("\t栈已经被摧毁\n");}break;case 6:if(S.base==NULL){printf("\t在进行操作6之前需要操作功能9\n");}else{printf("\t6.清空一个栈\n");ClearStack(S);printf("\t栈已经清空");}break;case 7:if(S.base==NULL){printf("\t在进行操作7之前需要操作功能9\n");}else{printf("\t7.求栈的长度\n");StackLength(S);}break;case 8:if(S.base==NULL){printf("\t在进行操作8之前需要操作功能9\n");}else{printf("\t弹栈,并且返回出弹栈元素\n");int a;Pop(S,&a);printf("\t8.弹栈弹出的元素是%d\n",a);}break;case 9:printf("\t9.输入栈内数据\n");InputStack(S);break;case 10:if(S.base==NULL){printf("\t在进行操作10之前需要操作功能9\n");}else{printf("\t10.在清空的基础下重新建立栈\n");DestroyStack(S);printf("\t请重新输入栈内数据\n");InputStack(S);}break;case 11:if(S.base==NULL){printf("\t在进行操作11之前需要操作功能9\n");}else{printf("\t11.在栈顶插入元素\n");int x;printf("\t请输入想要插入栈顶的元素:\n");scanf("%d",&x);Push(S,x);printf("\t插入完成\n");}break;default:printf("输入有误,请重新输入\n");}printf("\n\n\n");program();printf("\t输入的元素是:");scanf("%d",&num);printf("\n\n");}
}

15.运行结果

在没有建立栈的条件下如果输入别的数据

1.建栈

2.按栈弹出的顺序输出栈

3.按栈输入的顺序输出栈里面的值

4.获取栈顶元素

7.求栈的长度

8.弹栈,并且返回出弹栈元素

验证:

11.请输入想要插入栈顶的元素

6.清空

验证:

10.在清空的状态下重新输入栈

验证:

5.摧毁栈

0.退出

栈的基本操作(详细)相关推荐

  1. 链栈的基本操作(超详细)

    目录 前言 一.链栈的定义 二.链栈的c++语言结构描述表示 三.链栈中基本操作的实现 3.1链栈的初始化 3.2判断链栈是否为空 3.3求链栈的长度 3.4 链栈的入栈 3.4 链栈的出栈 3.5求 ...

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

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

  3. 数据结构源码笔记(C语言):栈的基本操作

    #include <stdio.h> #define MaxSize 100typedef char ElemType;typedef struct {char stack[MaxSize ...

  4. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  5. c++:栈的基本操作+实例:迷宫求解

    栈的基本操作+实例:迷宫求解 #include<iostream> using namespace std;struct Node {int datai;int dataj;Node* n ...

  6. python 链栈及基本操作

    链栈,即用链表实现栈存储结构 链栈的实现思路同顺序栈类似,顺序栈是将顺序表(数组)的一端作为栈低,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈低,如图1所示: 将链表头部作为栈顶 ...

  7. 二叉树和栈的基本操作

    二叉树和栈的基本操作 Tree.h: #pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include < ...

  8. 数据结构-“栈”的基本操作

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  9. 重学数据结构004——栈的基本操作及实现(数组实现)

    上文提到过栈以及栈的基本操作.上文中是基于链表做的实现.但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的. 另外一种实现方式是基于数组的实现.这种实现方式需要预先制定一 ...

  10. 栈的基本操作 python

    7-4 栈的基本操作 (10 分) 给定一个初始为空的栈和一系列进栈.出栈操作,请编写程序输出经过这些操作后栈的元素.栈的元素值均为整数. 输入格式: 输入第1行为1个正整数n,表示操作个数: 第2行 ...

最新文章

  1. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)...
  2. 一个爬虫的demo,requests,beatuifulsoup使用的
  3. python3下载文件-使用Python 3从网上下载文件
  4. android6.0单独编译和调试framework源码的方法
  5. 启明云端感谢热心开发者分享SSD20x直接编译lvgl7.10带双缓(附源码)
  6. Apache配置静态缓存
  7. 安卓操作系统版本(Version)与应用程序编程接口等级(Application Programming Interface Level)对照表...
  8. Delphi插件创建、调试与使用应用程序扩展
  9. 配置和运行 MatchNet CVPR 2015 MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching...
  10. MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新
  11. DevExpress DateEdit 5 常见问题解决方法
  12. byte拷贝java_Java字节流实现文件夹的拷贝
  13. SAP学习记__物料管理(MM)模块__采购入库冲销、退货
  14. 刘铁猛挨踢人感言:做一个高情商的程序员
  15. wincc服务器不能创建项目,wincc不能创建和打开项目
  16. python:实现lowest common ancestor最低共同祖先算法(附完整源码)
  17. 名词用作动词举例_[名词的活用] 名词的活用例子
  18. 做前端,如何克服新技术焦虑?
  19. ndn-tools:dissect-wireshark的使用
  20. loj10155:数字转换:树的直径问题

热门文章

  1. 碳中和数据全集-最全碳排放、碳封存、碳排放权配额、碳交易、能源消费与二氧化碳排放
  2. 固高运动控制卡学习3 --前瞻预处理
  3. 黑色沙漠未能连接补丁服务器,打开黑色沙漠提示网络异常或者连接不上
  4. 计算机如何更新苹果系统,苹果系统怎么更新_苹果电脑mac如何更新升级系统-win7之家...
  5. 苹果手机java设置_苹果java文件怎么打开?苹果手机安装JAVA程序的方法
  6. Atheros QCA8337交换芯片驱动开发
  7. Photoshop CC 2018安装及破解
  8. 平安银行java面试_平安银行JAVA笔试题一.doc
  9. Android AppCompat 库详解
  10. 总结嵌入式C语言知识点