//数组栈,对于无法预料栈的长度情况下,可能会因为原分配数组不够长而导致数据溢出,或因为数组太长而浪费空间。但是操作快,不需要额外的操作。而链表与此想法,可以动态分配内存,但是要增加额外的操作。
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

int main()
{
 int i;
 Type x;
 STACK *s = NULL;
 Type arr[] = {3,1,2,5,7,9};

s = CreateStack(10);
 if(s == NULL)
  return -1;

for(i = 0; i < sizeof(arr)/sizeof(*arr); i++)
 {
  PushStack(s, arr + i);
 }
 TopAndPopStack(s, &x);
 printf("x = %d\n", x);
 PosStack(s);
 TopOfStack(s, &x);
 printf("x = %d\n", x);
 
 return 0;
}
--------------------------------------------------------------------------

#ifndef _STACK_H__
#define _STACK_H__

struct node;
typedef int Type;
typedef struct node STACK;

STACK *CreateStack(int);
void StackMakeEmpty(STACK *);
int StackIsEmpty(STACK *);
int StackIsFull(STACK *);
int PushStack(STACK *, const Type *);
int PosStack(STACK *);
int TopOfStack(STACK *, Type *);
int TopAndPopStack(STACK *, Type *);
int DisposeStack(STACK *);

struct node{
 Type *data;
 int capacity;
 int topofstack;
};

#endif
-----------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

STACK *CreateStack(int size)
{
 STACK *s = malloc(sizeof(*s));
 if(NULL == s)
  return NULL;
 s->data = malloc(sizeof(Type)*size);
 if(NULL == s->data)
 {
  free(s);
  return NULL;
 }
 s->capacity = size;
 StackMakeEmpty(s);
 return s;
}
void StackMakeEmpty(STACK *s)
{
 s->topofstack = -1;
}
int StackIsEmpty(STACK *s)
{
 return s->topofstack == -1;
}
int StackIsFull(STACK *s)
{
 return s->capacity == (s->topofstack + 1);
}
int PushStack(STACK *s, const Type *x)
{
 if(StackIsFull(s))
  return -1;
 s->data[++s->topofstack] = *x;
 return 0;
}
int PosStack(STACK *s)
{
 if(StackIsEmpty(s))
  return -1;
 s->topofstack--;
 return 0;
}
int TopOfStack(STACK *s, Type *x)
{
 if(StackIsEmpty(s))
  return -1;
 *x = s->data[s->topofstack];
 return 0;
}
int TopAndPopStack(STACK *s, Type *x)
{
 if(!TopOfStack(s, x))
  return PosStack(s);
 return -1;
}
int DisposeStack(STACK *s)
{
 free(s->data);
 free(s);
}

ArrStack——数组栈(procedure)的更多相关文章

  1. java——数组栈 ArrayStack

    栈的应用: undo操作-编辑器 系统调用栈-操作系统 括号匹配-编译器 以下是动态数组实现的数组栈: 定义动态数组: package Date_pacage; public class Array& ...

  2. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  3. java:数据结构复习(二)数组栈

    import java.util.Arrays;import java.util.Scanner; /** * @author 李正阳 */public class MyArraysStack< ...

  4. c++如何解决大数组栈内存不够的问题

    在c++中,我们可以直接通过下面的方式创建一个数组: ; ; ; double phi[N][Nx][Ny]; double phi_b[N][Nx][Ny]; 但是,如果上述的Nx和Ny比较小还好说 ...

  5. [js]数组栈和队列操作

    写在前面 在项目中,对数组的操作还是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,这里记录一下这个知识点. 栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一 ...

  6. Java手写数组栈

    public class ArrayStack{ private String[] items; //数组 private int count; //栈内元素 private int n; //栈大小 ...

  7. 数组栈的C语言实现

    #ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...

  8. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  9. PHP数组常用函数

    [官方]PHP Array 函数 一.数组操作的基本函数 数组的键名和值 array_values($arr);  获得数组的值 array_keys($arr);  获得数组的键名 array_fl ...

随机推荐

  1. OC - 17.AFNetworking原理及常用操作

    AFN的六大模块 NSURLConnection,主要对NSURLConnection进行了进一步的封装,包含以下核心的类: AFURLConnectionOperation AFHTTPReques ...

  2. uniq和sort的用法

    uniq和sort都是按行操作的linux命令. sort按文本行排序,如下所示的log文件:直接sort log即可将其排序. 容易忽略的是sort -n命令,在如下例子中将看到 如果直接sort则 ...

  3. Angular简单应用剖析

    这一篇我们将一起感受学习一个小型的.活生生的应用,而不是继续深入分析哪些单个的特性.我们将会一起感受一下,前面所讨论过的所有片段如何才能真正的组合在一起,形成一个真实的.可以运行的应用. GutHub ...

  4. cookie : 存储数据

    cookie : 存储数据,当用户访问了某个网站(网页)的时候,我们就可以通过cookie来像访问者电脑上存储数据 1.不同的浏览器存放的cookie位置不一样,也是不能通用的 2.cookie的存储 ...

  5. java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)

    head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...

  6. PreResultListener使用

    PreResultListener是一个监听器接口,可以在Action处理完之后,系统转入实际视图前被回调. Struts2应用可以给Action.拦截器添加PreResultListener监听器, ...

  7. linux自定义开机启动服务

    转 http://www.cnblogs.com/jimeper/archive/2013/03/12/2955687.html 手工创建服务 1.在/etc/rc.d/init.d目录下创建shel ...

  8. Object之魔术函数__call() 处理错误调用

    在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用.上代码: <?php class Person{ function say(){ echo " ...

  9. quick-x 计时器的写法

    local scheduler = require("framework.scheduler") --计时器 function MainScene:recoderTime() pr ...

  10. 安装windows操作系统

    我认为windows安装有两种源文件,一种是ghost(.gho),一种是安装包(setup.exe). ghost安装是把将一个硬盘中的数据(.gho)完全相同地恢复到系统硬盘中.优点是速度快,而且 ...