C语言实现顺序栈心得

栈的构成及初始化

对于“先进后出”的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量。

栈容量即栈的最大容量,若超过会产生溢出错误。当然,必要时也可以扩充容量。

栈元素可以通过动态数组( base[] )存放。初始化时用 malloc 申请(栈容量 * 元素类型)个空间。

栈顶指针用于记录栈元素个数,始终指向栈顶元素的上一个单位(如 栈顶元素为base[3],栈顶指针为4),这样就能实现元素个数的记录。不过,栈顶指针只是一种形象化的叫法,方便起见,一般将其定义为 int 型。初始化时,栈顶指针置0。

定义结构体

struct sta
{
    int top;
    int *base;
    int size;
};

typedef struct sta ZAN;

栈的建立(分配空间)

ZAN* create()
{
    ZAN *p;

p=(ZAN *)malloc(sizeof(ZAN));

return p;
}

栈的初始化

void zer(ZAN *s)
{
    s->top=0;
    s->size=INI;                        //#define INI 10
    s->base=(int *)malloc(INI*sizeof(int));
}

压栈

压栈就是让元素进栈,栈顶指针 top 加一,元素存入数组 base[] 。如果已经栈满,可以增加内存空间(实际上是重新分配空间),此时栈容量 size 也要加一。用返回值判断是否压栈成功。

int push(ZAN *s,int x)
{

if( (s->top) >= (s->size) )
    {
        s->base=(int *)realloc(s->base,(s->size+1)*sizeof(int));
        if(!s->size) return 0;
        s->size++;
    }
    s->top++;
    s->base[s->top-1]=x;
    return 1;

}

取栈顶元素

取顶只用把栈顶元素的值记录下来,而不需要让其出栈。可以用指针来取值。同样,用返回值判断是否取顶成功。

int gettop(ZAN *s,int *e)
{
    if(s->top==0) return 0;
    else
    {
        *e=s->base[(s->top)-1];
        return 1;
    }
}

弹栈

弹栈是取出其值,并让栈顶元素出栈,top减一。同样,用指针记录其值,用返回值判断是否弹栈成功。

int pop(ZAN *s,int* e)
{
    if(!s->top) return 0;
    else
    {
        *e=s->base[(s->top)-1];
        s->top--;
        return 1;
    }
}

求栈长

取出 top 的值即可

int getlen(ZAN* s)
{
    return s->top;
}

判断栈是否为空

看 top 是否为0即可

int isempty(ZAN* s)
{
    if(!s->top) return 0;
    else return 1;
}

输出栈元素

将 base[] 自顶向下输出即可,不对栈进行任何操作。

void list(ZAN* s)

{

  int i;

  puts("\n list ZAN:");

  for(i=s->top-1;i>=0;i--)

  {

    if(i!=s->top-1) printf("\n");          //此处可以用空格代替换行

    printf("%d",s->base[i]);

  }

  puts("");

}

测试功能

// TEST FUNCTION

main()
{
    ZAN *create();
    void zer(ZAN *s);
    int push(ZAN *s,int x);
    int gettop(ZAN *s,int *e);
    int getlen(ZAN* s);
    int isempty(ZAN* s);
    void list(ZAN* s);
    ZAN *s;
    int n,*e,i=1;

i=1;e=&i;                                                           // protect

s=create();                                                         // create a stack
    zer(s);                                                             // initialize

if(!isempty(s)) puts("ZAN is empty\n");                               // empty?
    else puts("ZAN is not not empty\n");

puts(" push int x:");                // push an element in
    scanf("%d",&n);
    if(push(s,n)) ;
    else printf(" push %d error\n",n);

if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

printf("\n push int x:\n");
    scanf("%d",&n);
    if(push(s,n)) ;                                            // push an element in
    else printf("push %d error\n",n);

if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

if(pop(s,e)) printf("pop %d\n",*e);          //pop top element
    else printf("pop %d error\n",n);

if(gettop(s,e)) printf("gettop %d\n",*e);                      // get top element
    else puts("gettop error");

if(!isempty(s)) puts("ZAN is empty\n");                               // empty?
    else puts("ZAN is not not empty\n");
    if(isempty(s)) list(s);

printf("\n push int x:\n");
    scanf("%d",&n);
    if(push(s,n)) ;                                            // push an element in
    else printf("push %d error\n",n);

if(isempty(s)) list(s);                  //output ZAN
}

时间: 2024-10-16 22:58:48

C语言实现顺序栈心得的相关文章

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

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

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

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

顺序栈的c语言实现

Football on Table 题意:一些杆上有人,人有一个宽度,然后现在有一个球射过去,要求出球不会碰到任何人的概率 思路:计算出每根杆的概率,之后累乘,计算杆的概率的时候,可以先把每块人的区间长度再移动过程中会覆盖多少长度累加出来,然后(1?总和/可移动距离)就是不会碰到的概率 代码: #include <stdio.h> #include <string.h> #include <math.h> const double eps = 1e-8; int t,

顺序栈的栈基本操作(C语言版)

由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不支持 ,C++才支持,所以用 C语言写就需要使用指针 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 1

顺序栈用C语言实现

从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表: 但从数据类型角度来看,它们是和线性表大不相同的两种重要的抽象数据类型. 顺序栈,即栈的顺序存储结构是用一组地址连续的存储单元依次存放自栈顶到栈顶的数据元素 typedef struct { int * base; //栈底指针,在栈构造之前和摧毁之后,base的值为NULL int * top; //栈顶指针,在非空栈始终指向栈顶元素的下一个位置 int stacksize; //

顺序栈(C语言版)

//SeqStack.h </pre><pre name="code" class="cpp">/* stack:Last In First Out */ //1.定义顺序栈的结构 typedef struct stack { DATA data[SIZE+1]; int top; //栈顶 }SeqStack; //2.初始化栈 SeqStack *SeqStackInit() { SeqStack *p; if(p=(SeqStack *

【小白成长撸】--顺序栈(C语言版)

1 // 顺序栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h"//test1.0--栈表仅限Int类型 5 #include <stdio.h> 6 7 #define true 1 8 #define false 0 9 10 typedef struct stack_type 11 { 12 int stack[100];//最大容纳100个元素 13 int top; 14 }stacktype; 15 16 in

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)