| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1681 人关注过本帖
标题:简单的栈实现
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
 问题点数:0 回复次数:10 
简单的栈实现
程序代码:
//静态数组实现:
#define StackElementType int
//不用typedef的目的是为了提高灵活性,在编译阶段可以通过命令行指定元素类型
//如果是多文件,typedef将绝对优于#define
void
push( StackElementType value );
//将一个值压入栈
void
pop( void );
//将一个值从栈中删除,但不弹出
StackElementType
top( void );
//将一个值从栈中弹出,但不删除
int
is_empty( void );
//栈空检查
int
is_full( void );
//栈满检查



程序代码:
#include "stack.h"
#include <assert.h>
#define STACK_MAX_SIZE 100
static StackElementType Stack[ STACK_MAX_SIZE ];
static int StackTop = -1;

void
push( StackElementType value )
{
    if( is_full() )
    {
        printf("栈已满\n");
        return;
    }
    Stack[ ++StackTop ] = value;
}

void
pop( void )
{
    if( is_empty() )
    {
        printf("空栈,无法删除栈顶元素\n");
        return;
    }
    --StackTop;
}

StackElementType
top( void )
{
    assert( !is_empty() );
    return Stack[ StackTop ];
}

int
is_empty( void )
{
    return StackTop == -1;
}

int
is_full( void )
{
    return StackTop == STACK_MAX_SIZE - 1;
}



程序代码:
//动态数组实现:
#define StackElementType int
void
create_stack( void );//创建栈
void
destroy_stack( void );//销毁栈
void
push( StackElementType value );//将一个值压入栈
void
pop( void );//将一个值从栈中删除,但不弹出
StackElementType
top( void );//将一个值从栈中弹出,但不删除
int
is_empty( void );//栈空检查
int
is_full( void );//栈满检查


程序代码:
#include <stdlib.h>
#include "MallocStack.h"
#include <stdio.h>
#include <assert.h>
#define STACKSIZE 124

static int StackCurrentSize = STACKSIZE;
static int StackTop = -1;
static StackElementType *Stack;

void
create_stack( void )
{
    if( NULL == Stack )
    {
        Stack = ( StackElementType * )malloc( StackCurrentSize * sizeof( StackElementType) );
        if( NULL == Stack )
        {
            printf( "无法创建栈\n" );
            return;
        }
    }
    else
    {
        printf( "栈已存在,无法创建\n" );
        return;
    }
}

void
destroy_stack( void )
{
    if( NULL != Stack )
    {
        free( Stack );
        Stack = NULL;
        StackTop = -1;
        StackCurrentSize = STACKSIZE;
    }
    else
    {
        printf( "栈不存在,不能销毁\n" );
        return;
    }
}

int
is_empty( void )
{
    if( NULL == Stack )
        return 1;

    return StackTop == -1;
}

int
is_full( void )
{
    StackElementType *temp;

    temp = NULL;

    if( StackTop == StackCurrentSize - 1 )
    {
        StackCurrentSize += STACKSIZE;
        temp = ( StackElementType * )realloc( Stack, StackCurrentSize * sizeof(StackElementType ) );
        if( NULL == temp )
        {
            StackCurrentSize -= STACKSIZE;
            return 1;
        }
        else
        {
            Stack = temp;
            return 0;
        }
    }
    if( NULL == Stack )
        return 1;
    return 0;
}

void
push( StackElementType value )
{
    assert( !is_full() );

    Stack[ ++StackTop ] = value;    
}

void
pop( void )
{
    assert( !is_empty() );

    --StackTop;
}

StackElementType
top( void )
{
    assert( !is_empty() );

    return Stack[ StackTop ];
}





程序代码:
//链表实现
#define StackElementType int
void
destroy_stack( void );
void
push( StackElementType value );
void
pop( void );
StackElementType
top( void );
int
is_empty( void );
int
is_full( void );


程序代码:
#include "ListStack.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct Node{
    StackElementType value;
    struct Node *Next;
}StackType;

static StackType *Stack;

int
is_empty( void )
{
    return Stack == NULL;
}

int
is_full( void )
{
    return 0;
}
void
destroy_stack( void )
{
    StackType *Temp, *This;

    This = Stack;
    Stack = NULL;

    while( NULL != This )
    {
        Temp = This;
        This = This->Next;
        free( Temp );
    }
}

void
push( StackElementType value )
{
    StackType *NewCell;

    NewCell = ( StackType * )malloc( sizeof( StackType ) );
    if( NULL == NewCell )
        return;
    NewCell->value = value;
    NewCell->Next = Stack;
    Stack = NewCell;
}

void
pop( void )
{
    StackType *Temp;

    if( is_empty() )
        return;

    Temp = Stack;
    Stack = Stack->Next;
    free( Temp );
}

StackElementType
top( void )
{
    assert( !is_empty() );
    return Stack->value;
}


[此贴子已经被作者于2017-3-27 08:32编辑过]

搜索更多相关主题的帖子: 元素 
2017-03-27 08:30
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
顶一个  关于算法 我可以打0分

DO IT YOURSELF !
2017-03-27 17:24
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 wp231957
嗯……这么一看,不如我们成立一个算法0分联盟。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
九九也来顶一个~感觉九九有个不成文的习惯~就是比较喜欢用链栈和链队列~虽然实现会比数组复杂~但我还是习惯敲了~倒是数组的没咋认真看~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-27 17:28
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 九转星河
数组栈效率高,特别是动态数组栈,不存在栈满,比链式栈效率高不少。但是我这里说的是传统的链式栈,不包括一个节点就是一个栈,这样的链式栈已经和动态数组栈没啥区别了。不过好处在于可以拥有多个栈。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:30
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 renkejun1942
九九来……凑热闹的~
就是算法0分联盟这个感觉有点吸引眼球~~
倒不如来个算法1+1联盟~~就是说说1+1是最基础的~但1+1+1+1……这样积累下去就会变得很厉害了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-27 17:37
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 九转星河
我想唯一的问题在于,对我来说,这个1分估计会在很久很久之后。
因为我的计划在短时间内不包括算法。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-27 17:39
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我只对感兴趣的课题感兴趣  

DO IT YOURSELF !
2017-03-27 17:45
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 wp231957
就像我对C感兴趣但对Java和高数打不起精神一样~感觉学习一样感兴趣的东西就要学好学精~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-27 17:47
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
留下脚印。太累了, 我要去洗澡了
2017-05-19 23:09
快速回复:简单的栈实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044874 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved