利用数组实现栈

利用结构体封装一个内部数组,和一个元素游标,就可以实现栈了。

内部数组可以存储在内存的栈中(Stack),也可以动态申请,存储组堆中(Heap)

储存在栈中,则需要制定栈的最大容量。储存在堆中,就可以通过malloc函数申请初始容量,当容量不够后,还可哟通过realloc函数扩充。

下面是用栈储存区实现的,因此不涉及动态内存分配和释放的问题,都由系统帮我们管理。

/*********
file : ArrayStack.h
date:2016/3/26

*********/

#ifndef _ARRAYSATCK_H_
#define _ARRAYSATCK_H_

#define NULL 0
const int MAX_SIZE = 50;   //栈的最大容量
typedef int DataType;

typedef struct {
    DataType InnerArr[MAX_SIZE];

    int cur;    //实际元素个数的游标 ,初始化为-1 

}ArrayStack;

void InitStack(ArrayStack* mystack);
DataType GetPeek(const ArrayStack* mystack);
int Pop(ArrayStack* mystack, DataType*de);
int Push(ArrayStack* mystack , DataType newData);
int StackIsEmpty(const ArrayStack* mystack);
int StackIsFull(const ArrayStack* mystack);
void ClearStack(ArrayStack* mystack);
int StackLength(const ArrayStack* mystack);

#endif
/****************** file:ArrayStack.cpp date:2016/3/26*******************/

#include "ArrayStack.h"

//初始化栈
void InitStack(ArrayStack* mystack)
{

    mystack->cur = -1;

}

DataType GetPeek(const ArrayStack* mystack)
{
    return mystack->InnerArr[mystack->cur];

}

int Pop(ArrayStack* mystack, DataType*de)
{
    if(StackIsEmpty(mystack)) return 0;

    if(de!=NULL)   //如果用户需要保存这个被删除的元素
      *de = mystack->InnerArr[mystack->cur];

    (mystack->cur)--;
    return 1;

}

int Push(ArrayStack* mystack , DataType newData)
{
    if(StackIsFull(mystack))   return 0;

    (mystack->cur)++;
    mystack->InnerArr[mystack->cur] = newData;
    return 1;

}

int StackIsEmpty(const ArrayStack* mystack)
{

    return mystack->cur == -1;

}

int StackIsFull(const ArrayStack* mystack)
{
    return mystack->cur == MAX_SIZE-1; 

}

void ClearStack(ArrayStack* mystack)
{
    mystack->cur = -1;

}

int StackLength(const ArrayStack* mystack)
{
    return mystack->cur+1;

}
时间: 2024-11-13 08:09:57

利用数组实现栈的相关文章

[HAOI2016]找相同字符(后缀数组+单调栈)

[HAOI2016]找相同字符(后缀数组+单调栈) 题面 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 分析 我们把两个字符串接在一起,中间加一个分隔符.如\(\text{AABB}\)和\(\text{BBAA}\)变成\(\text{AABB|BBAA}\).我们考虑两个相同字串,如\(\text{BB}\),它在新串中对应了两个后缀\(BB|BBAA\)和\(\text{BBAA}\)的LCP. 容易发现,LC

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr

用数组模拟栈的结构

package datastruct; import java.util.Arrays; /** * 用数组模拟栈的结构:后进先出(LIFO) 线性表结构 * @author stone * 2014-07-29 06:34:49 */ public class SimulateStack<E> { public static void main(String[] args) { SimulateStack<String> ss = new SimulateStack<Str

HUID 5558 Alice&#39;s Classified Message 后缀数组+单调栈+二分

http://acm.hdu.edu.cn/showproblem.php?pid=5558 对于每个后缀suffix(i),想要在前面i - 1个suffix中找到一个pos,使得LCP最大.这样做O(n^2) 考虑到对于每一个suffix(i),最长的LCP肯定在和他排名相近的地方取得. 按排名大小顺序枚举位置,按位置维护一个递增的单调栈,对于每一个进栈的元素,要算一算栈内元素和他的LCP最大是多少. 如果不需要输出最小的下标,最大的直接是LCP(suffix(st[top]),  suff

用数组实现栈

用数组表示栈 选择用数组表示栈内容必须预先估计栈的最大容量.在Java中,数组一旦创建,其大小是无法改变的,而数组设置过大可能会浪费大量内存,设置过小又可能会溢出. 所以我们希望能够动态调整数组a[i]的大小,使得它既足以保存所有元素,又不至于浪费过多的空间. 首先,实现一个方法将栈移动到另一个大小不同的数组中. 1 private void resize(int max) { 2 3 Item[] temp = (Item[]) new Object[max]; 4 for (int i =

JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一般来讲使用对象字面量来封装多个可选参数. 3.对象属性的点表示法与方括号表示法的区别 (1)功能上:两者没区别 (2)但是方括号的有点是可以通过变量来访问属性 例如: var person={ name:"Nic" } 点表示法:person.name 方括号表示法:var prop=“nam

EularProject 48: 利用数组求和

Problem 48 The series, 11+22+33+...+1010=10405071317. Find the last ten digits of the series, 11+22+33+...+10001000. Answer: 9110846700 Completed on Thu, 23 Jul 2015, 17:26 初步思路,可以利用元对的方式计算每一个数需要乘的数 def func(a): for i in range(0,len(a)): a[i][1]*=a[i

利用数组求前n个质数

我的算法思想和实现方式都在代码和注释当中呢,这样的方式确实使算法复杂度降低一个等级,很好啊. #include <stdio.h> #include <time.h> /** * 利用数组求前n个质数 * 确定一个数m是否为质数,可以用已求出的质数对m * 的整除性来确定 */ //如果不知道质数的特性和想不到优化思路的方法 void getNPrimes_normal(); //优化之后的方法 void getNPrimes_optimize(); int main(void)

java、C语言实现数组模拟栈

java: public class ArrayStack { private int[] data; private int top; private int size; public ArrayStack(int size) { this.data = new int[size]; this.size = size; this.top = -1; } public boolean isEmpty() { if (this.top == -1) { return true; } return