/* stack.h */

#ifndef _stack_h
#define _stack_h struct stack_record;
typedef struct stack_record *stack;
typedef int element_type; int is_empty( stack s );
int is_full( stack s );
stack create_stack( int max_elements );
void dispose_stack( stack s );
void make_empty( stack s );
void push( element_type x, stack s );
element_type top( stack s );
void pop( stack s );
element_type top_and_pop( stack s ); #endif
/* stack.c */

#include "stack.h"
#include <stdio.h>
#include <stdlib.h> #define MIN_STACK_SIZE 5 struct stack_record
{
int capacity;
int top_of_stack;
element_type *array;
}; stack
create_stack( int max_elements )
{
stack s; if( max_elements < MIN_STACK_SIZE )
{
printf( "Stack size is too small\n" );
exit(0);
} s = malloc( sizeof( struct stack_record ));
if( s == NULL )
{
printf( "Out of sapce\n" );
exit(1);
} s->array = malloc( sizeof( element_type ) * max_elements );
if( s->array == NULL )
{
printf( "Out of space\n" );
exit(1);
} s->capacity = max_elements;
make_empty( s ); return s;
} void
dispose_stack( stack s )
{
if( s != NULL )
{
free( s->array );
free( s );
}
} int
is_empty( stack s )
{
return s->top_of_stack == -1;
} int
is_full( stack s )
{
return s->capacity == s->top_of_stack + 1;
} void
make_empty( stack s )
{
s->top_of_stack = -1;
} void
push( element_type x, stack s )
{
if( is_full( s ) )
{
printf( "Full stack!\n" );
exit(0);
}
else
s->array[++s->top_of_stack] = x;
} element_type
top( stack s )
{
if( !is_empty( s ) )
return s->array[s->top_of_stack];
else
{
printf( "Empty stack\n" );
exit(0);
} return 0;
} void
pop( stack s )
{
if( is_empty( s ) )
{
printf ("Empty stack\n");
exit(0);
}
else
s->top_of_stack--;
} element_type
top_and_pop( stack s )
{
if( !is_empty( s ) )
return s->array[s->top_of_stack--];
else
{
printf( "Empty stack\n" );
exit(0);
} return 0;
}
/* stack_test.c */

#include "stack.h"
#include <stdio.h> int
main(void)
{
stack s;
int x;
int y;
int z; s = create_stack(10); push( 1, s );
push( 2, s );
push( 3, s ); x = top_and_pop( s );
y = top_and_pop( s );
z = top_and_pop( s );
printf("%d\n%d\n%d\n", x, y, z); dispose_stack( s );
return 0;
}

 

测试结果:

栈的实现实例(C语言)的更多相关文章

  1. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  2. 实例15_C语言绘制万年历

    实例说明:

  3. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  4. JavaScript中的栈及通过栈操作的实例

    <script> /*栈操作*/ function Stack() { this.dataStore = []; this.top = 0; this.push = push; this. ...

  5. 栈(链式栈)----C语言

    链式栈:就是一种操作受限的单向链表,对单向链表还不了解的可先看一下之前的一篇关于单向链表的随笔,链表(单向链表的建立.删除.插入.打印),理解了单向链表后再来看链式栈就比较轻松了 链式栈的操作一般含有 ...

  6. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

  7. 栈的应用实例——计算后缀表达式

    用户输入一个后缀表达式,程序计算该后缀表达式的值并输出结果: /* postfix_expression.c */ #include "stack.h" #include < ...

  8. 数据结构 - 链栈的实行(C语言)

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

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

    数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...

随机推荐

  1. Automatic WordPress Updates Using FTP/FTPS or SSH

    Introduction When working with WordPress in a more secure environment where websites are not entirel ...

  2. BitTorrent Sync 老版本

    Sync version 1.4.111 Installer for Windows: BTSync.exe BTSync_x64.exe Installer for OSX: BTSync.dmgG ...

  3. NativeXml

    NativeXml GITHUB: https://github.com/kattunga/NativeXml THIS IS A FORK WITH SOME FIXES AND IMPROVEME ...

  4. C#编程(三)

    原文链接:http://blog.csdn.net/shanyongxu/article/details/46398713 C#中的常量 定义常量所需要的关键字:const,语法结果:const 变量 ...

  5. python测试开发django-10.django连接mysql

    前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...

  6. 软件系统分析师与架构师技能大PK(您具备了哪些呢?)

    博客转处:http://blog.csdn.net/china_video_expert/article/details/38335613 软件系统分析师与架构师在职责与技能方面没有明显的界线,你中有 ...

  7. ldap服务器OpenLDAP安装使用

    OpenLDAP 是 LDAP 协议的一个开源实现.LDAP 服务器本质上是一个为只读访问而优化的非关系型数据库.它主要用做地址簿查询(如 email 客户端)或对各种服务访问做后台认证以及用户数据权 ...

  8. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  9. Unity的延迟管线

    unity buildin deferred pipeline rt0 albedo rt1 spec rt2 normal rt3 emissive rt4 shadowmask rt3的使用方式 ...

  10. 再谈javascript图片预加载技术

    图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展 ...