数据结构 栈的操作实例详解

 更新时间:2020年4月25日 17:30  点击:1909

数据结构 栈的操作实例详解

说明:

    往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉。下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了。

一、实现

1.程序功能

  关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换。

2.预定义、头文件导入和类型别名

    代码如下:

#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
 
typedef int ElemType;
typedef int Status;

    除了两个头文件的导入是必须的之外,下面做两点说明:

(1)其余的常量定义都是可选的,为的就是在下面的代码书写过程中可以尽量使用英文来表达程序的意思,而不是在代码的实现过程中直接使用数字,依个人喜欢,也可以直接使用数字;

(2)使用typedef做类型的别名也仅仅是为了程序中代码的意思更加清晰明了而已,实际也可以不这样使用;

3.顺序栈的定义 

   代码如下:

typedef struct{
  ElemType *elem;   //存储空间的基址
  int top;      //栈顶元素的下一个元素,简称栈顶位标
  int size;      //当前分配的存储容量,作用看入栈操作就可以知道
  int increment;   //扩容时,增加的存储容量,作用看入栈操作就可以知道
} SqStack;         //顺序栈名称

4.栈的初始化

    代码如下:

Status InitStack_Sq(SqStack &S, int size, int inc){   //接受3个参数,&S是对结构体的引用
  S.elem = (ElemType*)malloc(size*sizeof(ElemType)); //分配存储空间
  if(S.elem == NULL) return OVERFLOW;   //判断上一步分配存储空间是否成功
  S.top = 0;      //置S为空栈,S.top为0即表示栈为空栈
  S.size = size;    //栈的空间初始容量值
  S.increment = inc;  //栈的空间初始增量值(如果需要扩容)
  return OK;    //上面的执行正常,返回OK
}

5.空栈的判断

    代码如下:

Status StackEmpty_Sq(SqStack S){
  if(S.top == 0)
    return TRUE;
  else
    return FALSE;
}
//空栈的决断是,如果栈为空就返回1,否则就返回0,当然可以不这样规定;
//至于为什么要做空栈的判断,自然是有原因的,下面再看程序的代码时就可以知道了。

6.入栈

    代码如下:

Status Push_Sq(SqStack &S, ElemType e){  //将元素e压入栈,这里e只是一个形参而已
  ElemType *newbase;    //定义中间变量
  if(S.top>= S.size){    //S.top如果指向最后一个不存储元素的地址时,即S.top大于
    newbase = (ElemType*)realloc(S.elem, //等于S.size时,就表示栈满了
  (S.size + S.increment)*sizeof(ElemType)); //通过realloc动态扩容
   
  if(NULL == newbase) return OVERFLOW; //判断扩容是否成功
  S.elem = newbase;   //扩容成功后才将中间变量的值指向S.elem,防止扩容失败时,
  S.size = S.size + S.increment;   //S.elem指向一个不是原来的位置
  }
  S.elem[S.top] = e;  //将e元素入栈
  S.top++;       //使S.top加1,表示指向的是栈顶位标
  return OK;      //上面操作正常后返回1
}

7.出栈

    代码如下:

Status Pop_Sq(SqStack &S, ElemType &e){  //栈顶元素出栈,赋给元素e
  if(0 == S.top) return ERROR;  
  e = S.elem[--S.top];  //e出栈,并将S.top减1
  return OK;
}

8.进制转换的函数

    其实上面的步骤操作都是为了创建一个顺序栈和定义顺序栈的操作而已,并对可能出现的各种情况做一些相应的举措,完毕后,下面就要使用上面创建的顺序栈以及栈的操作接口了,即在数制转换函数(这里是十进制转八进制)中使用上面的操作接口,代码如下:

void Converstion(int N){
  SqStack S;
  ElemType e;
  InitStack_Sq(S, 10, 5);  //栈S的初始容量置为10,每次扩容容量为5
   
  while(N != 0){
    Push_Sq(S, N%8);  //将N除以8的余数入栈
    N /= 8;      //N取值为其除以8的商
  }             //理论基础为除8取余法
   
  while(StackEmpty_Sq(S) == FALSE){
    Pop_Sq(S, e);  //依次输出栈中的余数,并赋给元素e
    printf("%d", e); //打印元素
  }

9.main函数

    进制转换函数调用栈操作的接口函数,以实现在数制转换过程中栈的操作;main函数调用数制转换函数,以实现数制的转换,代码如下:

int main(void){
  printf("Enter a number:");scanf("%d",&num);
  Converstion(num);
  printf("\n");
}

二、执行

    有了上面的代码后,就可以在编译器中编译执行了,这里我是用c free 5来进行程序代码的编译:

(1)输入的数为1348时的结果:

(2)输入的数为2526时的结果:

三、完整的代码

    下面把代码都放在一起:

#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
 
typedef int ElemType;
typedef int Status;
 
typedef struct{
  ElemType *elem;
  int top;
  int size;
  int increment;
} SqStack;
 
Status InitStack_Sq(SqStack &S, int size, int inc){
  S.elem = (ElemType*)malloc(size*sizeof(ElemType));
  if(S.elem == NULL) return OVERFLOW;
  S.top = 0;
  S.size = size;
  S.increment = inc;
  return OK;
}
 
Status StackEmpty_Sq(SqStack S){
  if(S.top == 0)
    return TRUE;
  else
    return FALSE;
}
 
Status Push_Sq(SqStack &S, ElemType e){
  ElemType *newbase;
  if(S.top>= S.size){
    newbase = (ElemType*)realloc(S.elem,
  (S.size + S.increment)*sizeof(ElemType));
   
  if(NULL == newbase) return OVERFLOW;
  S.elem = newbase;
  S.size = S.size + S.increment;
  }
  S.elem[S.top] = e;
  S.top++;
  return OK;
}
 
Status Pop_Sq(SqStack &S, ElemType &e){
  if(0 == S.top) return ERROR;
  e = S.elem[--S.top];
  return OK;
}
 
void Converstion(int N){
  SqStack S;
  ElemType e;
  InitStack_Sq(S, 10, 5);
   
  while(N != 0){
    Push_Sq(S, N%8);
    N /= 8;
  }
   
  while(StackEmpty_Sq(S) == FALSE){
    Pop_Sq(S, e);
    printf("%d", e);
  }
}
 
int main(void){
  int num;
  printf("Enter a number:");scanf("%d",&num);
  Converstion(num);
  printf("\n");
}

[!--infotagslink--]

相关文章

  • C#数据结构之队列(Quene)实例详解

    这篇文章主要介绍了C#数据结构之队列(Quene),结合实例形式较为详细的讲述了队列的功能、原理与C#实现队列的相关技巧,需要的朋友可以参考下...2020-06-25
  • JavaScript 栈的详解及实例代码

    这篇文章主要介绍了JavaScript 栈的详解及实例代码的相关资料,需要的朋友可以参考下...2017-01-26
  • C#常用数据结构和算法总结

    这篇文章主要介绍了C#常用数据结构和算法,这里我们总结了一些知识点,可以帮助大家理解这些概念。...2020-06-25
  • redis中的数据结构和编码详解

    本文主要和大家分享几种Redis数据结构详解,希望文中的案例和代码,能帮助到大家。...2021-01-15
  • Redis高效率原因及数据结构分析

    这篇文章主要为大家详细的介绍了Redis高效的原因以及分析了Redis高效的数据结构,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-27
  • Vue页面堆栈管理器详情

    这篇文章主要介绍了Vue页面堆栈管理器...2021-10-23
  • C#数据结构与算法揭秘二

    上文对数据结构与算法,有了一个简单的概述与介绍,这篇文章,我们介绍一中典型数据结构——线性结构...2020-06-25
  • c++中堆栈及创建对象示例代码

    这篇文章主要给大家详细介绍了c++如何实现堆栈及创建对象,文中先进行了简单的介绍,而后给出了详细的示例代码及注释,相信对大家的理解和学习很有帮助,有需要的朋友们下面跟着小编一起来学习学习吧。...2020-04-25
  • C语言数据结构递归之斐波那契数列

    这篇文章主要介绍了C语言数据结构递归之斐波那契数列的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下...2020-04-25
  • C++数据结构与算法之哈夫曼树的实现方法

    这篇文章主要介绍了C++数据结构与算法之哈夫曼树的实现方法,简单说明了哈夫曼树的原理,并结合具体实例形式分析了C++实现哈夫曼树的相关操作技巧,需要的朋友可以参考下...2020-04-25
  • C#实现用栈求逆序的方法示例

    这篇文章主要介绍了C#实现用栈求逆序的方法,涉及C#数据结构中栈的压入与取出相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 基于JavaScript的数据结构队列动画实现示例解析

    这篇文章主要介绍了基于JavaScript的数据结构队列动画实现示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-06
  • Go语言的队列和堆栈实现方法

    这篇文章主要介绍了Go语言的队列和堆栈实现方法,涉及container/list包的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
  • 浅谈单调队列、单调栈

    其实,单调队列和单调栈是类似的,在我看来,这两个东西只是名字不一样 - - ! 比较容易想的一道题啦! 首先,这题的两个关键点: 1、区间的和。这个简单,地球人都知道! 2、区间的最小值。...2020-04-25
  • 数据结构 双向链表的创建和读取详解及实例代码

    这篇文章主要介绍了数据结构 双向链表的创建和读取详解及实例代码的相关资料,需要的朋友可以参考下...2020-04-25
  • C语言之栈和堆(Stack && Heap)的优缺点及其使用区别

    本篇文章主要介绍了什么是栈(Stack) 、什么是堆( Heap),以及栈和堆的优缺点,同时介绍了应该什么时候使用堆和栈,有需要的朋友可以参考下...2020-04-25
  • C语言数据结构之动态分配实现串

    这篇文章主要介绍了C语言数据结构之动态分配实现串的相关资料,希望通过本文能帮助到大家,让大家实现数据结构中动态分配实现串的实例,需要的朋友可以参考下...2020-04-25
  • JavaScript数据结构与算法之栈与队列

    在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍....2016-02-01
  • 基本数据结构算法

    <? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){...2016-11-25
  • C语言数组栈实现模板

    这篇文章主要为大家详细介绍了C语言数组栈实现模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25