数据结构 栈的操作实例详解
数据结构 栈的操作实例详解
说明:
往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉。下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了。
一、实现
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"); }
上一篇:C语言线性表顺序存储结构实例详解
栏 目:C语言
本文标题:数据结构 栈的操作实例详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1412.html
您可能感兴趣的文章
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
- 01-10如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文