数据结构(C语言版)顺序栈相关算法的代码实现

  这两天完成了栈的顺序存储结构的相关算法,包括初始化、压栈、出栈、取栈顶元素、判断栈是否为空、返回栈长度、栈的遍历、清栈、销毁栈。这次的实现过程有两点收获,总结如下:

一、清楚遍历栈的概念

  栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的;栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制。

二、清空栈时要不要将stacksize重置

  网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论了后,最后决定不应重置stacksize的值,原因是:

  重置的目的是针对使用了realloc()重新分配了地址的栈,但是realloc()函数分配的是一段连续的地址,指向栈底的指针指向了这段空间,即使将stacksize重置回初始值,增加的那段空间还是由指向栈底的指针来控制的(参照这句S.base=(Elemtype *)realloc(S.base,(S.stacksize+STACKINCREACE)*sizeof(Elemtype));思考),因此重置没有意义。类比顺序表的清空:顺序表的清空也是只将当前长度置为0,没有改变它的listsize值。

  这次使用的编译环境是VC++6.0。

//头文件内容
//--------------------栈的顺序存储结构--------------------
#define STACK_INIT_SIZE 100
#define STACKINCREACE 10
typedef char Elemtype;//在头文件中说明
typedef int Status;
typedef struct{
    Elemtype *base;
    Elemtype *top;
    int stacksize;
}SqStack;
//----------------------函数声明部分----------------------
Status InitStack(SqStack &S);
Status Push(SqStack &S,Elemtype e);
Status Pop(SqStack &S,Elemtype &e);
Status GetTop(SqStack S,Elemtype &e);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status StackTraverse(SqStack S);
Status ClearStack(SqStack &S);
Status DestroyStack(SqStack &S);

//源文件内容
#include <stdio.h>
#include <stdlib.h>
#include "SqStackHeader.h"

//--------------------主函数入口--------------------
void main(){
    SqStack stack;
    char temp=‘a‘;
    char getElem=NULL;
    char popElem=NULL;
    InitStack(stack);
    Push(stack,temp);
    Push(stack,‘b‘);
    GetTop(stack,getElem);
    printf("栈顶元素是:%c\n",getElem);
    char *empty=NULL;
    empty=StackEmpty(stack)?"是空栈!":"不是空栈!";
//    printf("是否为空栈判断结果:%s\n",empty);
//    ClearStack(stack);
    DestroyStack(stack);
    StackTraverse(stack);

//    printf("栈的长度:%d\n",StackLength(stack));

//    Pop(stack,popElem);
}
//------------------栈的初始化函数------------------
Status InitStack(SqStack &S){
    S.base = (Elemtype *)malloc(STACK_INIT_SIZE*sizeof(Elemtype));
    //2016.4.17编译时报错:missing “)”before ;
    //错误原因:由于头文件中定义常量时后面加了;导致编译的时候将STACK_INIT_SIZE用100;代替,
    //使得该函数提前结束语100处,malloc后的“(”找不到匹配的“)”而报错
    //解决方法:去掉常量定义中的;
    if(!S.base){
        return false;
    }
    S.stacksize=STACK_INIT_SIZE;
    S.top=S.base;
    return true;
}
//---------------------入栈函数---------------------
Status Push(SqStack &S,Elemtype e){
//判断是否溢出
    if(S.top-S.base>=S.stacksize){
        S.base=(Elemtype *)realloc(S.base,(S.stacksize+STACKINCREACE)*sizeof(Elemtype));
        if(!S.base){
            return false;
        }
        S.top=S.base+S.stacksize;//注意因为这里的栈底指针的改变,导致栈顶指针随之改变
        S.stacksize+=STACKINCREACE;
    }
//压栈部分
    *S.top=e;
    S.top++;
    return true;
}
//---------------------出栈函数---------------------
Status Pop(SqStack &S,Elemtype &e){
//非法判断
    if(S.base==S.top){
        return false;
    }
    S.top--;    //注意这里因为top指向栈中当前元素的上一个空间,所以要先将其位置减一
    e=*S.top;
    return true;
    }
//-------------------查看栈顶元素-------------------
Status GetTop(SqStack S,Elemtype &e){
    if(S.base==S.top ){
        return false;
    }
    e=*(S.top-1);
    return true;
}
//------------------判断栈是否为空------------------
Status StackEmpty(SqStack S){
    if(S.base==S.top){
        return true;
    }
    return false;
}
//------------------返回栈元素个数------------------
int StackLength(SqStack S){
    if(S.base==S.top){
        return 0;
    }
    return S.top-S.base;
}
//--------------------遍历栈------------------------
Status StackTraverse(SqStack S){//从栈底到栈顶的方向
    if(S.top==S.base){
        return false;
    }
    while(S.base <S.top ){
        printf("%c\t",*(S.base++));
    }
    printf("\n");
    return true;
}
//--------------------清空栈------------------------
Status ClearStack(SqStack &S){//清空栈的时候不用将stacksize重新赋值
    S.top=S.base;             //因为经过realloc函数重新分配空间后(stacksize大小改变),
    return true;            //S.base指向的是一段stacksize大小的连续存储空间
                            //即使将他重置,剩余的空间也是闲置的(顺序表里也只是经当前长度置为0)
    }
//--------------------销毁栈------------------------
Status DestroyStack(SqStack &S){
    free(S.base);
    free(S.top);
    S.base=NULL;
    return true;
}
时间: 2024-10-22 21:58:53

数据结构(C语言版)顺序栈相关算法的代码实现的相关文章

数据结构(C语言版)顺序表相关算法代码实现

这两天实现了一下顺序表的相关操作,包括顺序表初始化.创建.遍历.第i个元素前插入,删除第i个元素.查找元素e的位置.清空顺序表.销毁顺序表.合并两个非递减顺序表操作. 这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数. 这次使用的编译环境是vc++6.0 //头文件部分 #define LIST_INIT_SIZE 5 #define INCREAMENT 5 typedef char Elemtype; typedef in

数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算. 算法: package stack;/********************************************************************** * @author sch ********利用栈,计算两个大数的和.大数的值超过int存储的范围******************************

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名 代码如下: #i

数据结构第七篇——顺序栈

?注:未经博主同意,不得转载. 栈(stack)是常用的重要数据结构,其应用十分广泛.栈是一个操作受限的线性表,其插入和删除操作都在表的同一端进行. 其中允许操作的一端称为栈顶(top),另一端称为栈底(bottom),不含元素的栈称为空栈. 栈的修改是按后进先出的原则进行的,因此,栈称为后进先出表(Last In First Out,LIFO).称插入元素的操作为入栈(push),删除元素的操作为出栈(pop). 栈由元素列表.指向栈顶的下标或指针以及栈的操作集组成.栈的具体实现有两种方式:顺

【数据结构之旅】顺序栈入门操作

说明: 书中已有关于顺序栈的类型定义.栈初始化.入栈操作,显然这些都是比较理论的算法,书中并没有给出一个完整可以执行的例子,这对初学者学习在理解上会有一定的难度,因此,需要编写一个简单的例子来理解栈的最基本操作. 1.程序功能 通过使用栈来编写一个程序,实现两个数的交换. 2.程序代码及注释 代码及注释如下: #include<stdio.h> #include<stdlib.h>    //导入stdlib.h模块是为了使用sizeof函数 typedef struct{    

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

C语言实现顺序栈心得

栈的构成及初始化 对于“先进后出”的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态数组( base[] )存放.初始化时用 malloc 申请(栈容量 * 元素类型)个空间. 栈顶指针用于记录栈元素个数,始终指向栈顶元素的上一个单位(如 栈顶元素为base[3],栈顶指针为4),这样就能实现元素个数的记录.不过,栈顶指针只是一种形象化的叫法,方便起见,一般将其定义为 int 型.初始化时,栈顶指针置