栈--数组实现

用数组实现栈避免了使用指针,但是存在的缺陷是必须提前确定数组的大小,一般来说,这并不是太大的问题。:

数组实现栈:

首先定义一个结构,TopOfStack表示栈顶,当TopOfStack为-1时,表示空栈。数组array用于存放栈元素

进栈(push)时  ++TopOfStack 然后把元素加进数组。出栈(pop)时直接 TopOfStack--;

c语言实现:

#ifndef _stack_h

struct stack;
typedef struct stack *Stack;
typedef int ElementType;

int isEmpty(Stack s);
int isFull(Stack s);
Stack CreateStack(int MaxElements);
void Push(ElementType x,Stack s);
ElementType Top(Stack s);
void Pop(Stack s);
ElementType TopAndPop(Stack s);
#endif
#include<stdio.h>
#include<stdlib.h>
#include"stack_array.h"

#define ElementTOS (-1)
#define MinStackSize (5)

struct stack{
    int Capacity;
    int TopOfStack;
    ElementType *Array;
};

int isEmpty(Stack s)
{
    return s->TopOfStack == ElementTOS;
}
int isFull(Stack s)
{
    return s->TopOfStack == s->Capacity;
}
Stack CreateStack(int MaxElements)
{
    Stack s;
    if(MaxElements<MinStackSize)
    {
        printf("The stack is too small!\n");
        return NULL;
    }
    s = (Stack)malloc(sizeof(struct stack));
    if(s==NULL)
    {
        printf("out of space!\n");
        return NULL;
    }
    s->Capacity = MaxElements-1;
    s->TopOfStack = ElementTOS;
    s->Array = (ElementType *)malloc(MaxElements*sizeof(ElementType));
    return s;
}
void Push(ElementType x,Stack s)
{
    if(!isFull(s))
        s->Array[++s->TopOfStack] = x;
    else
        printf("The stack is Full!\n");
}
ElementType Top(Stack s)
{
    if(!isEmpty(s))
        return s->Array[s->TopOfStack];
    else
    {
        printf("The stack is Empty!\n");
        return 0;
    }
}
void Pop(Stack s)
{
    if(!isEmpty(s))
        s->Array[s->TopOfStack--];
    else
        printf("The stack is Empty!\n");
}
ElementType TopAndPop(Stack s)
{
    if(!isEmpty(s))
        return s->Array[s->TopOfStack--];
    else
    {
        printf("The stack is empty!\n");
        return 0;
    }
}
int main()
{
    Stack s;
    s = CreateStack(6);
    Push(1,s);
    Push(2,s);
    Push(3,s);
    Push(4,s);
    Push(5,s);
    Push(6,s);
    Push(7,s);

    for(int i=0;i<6;i++)
    {
        printf("The top of stack is %d\n",Top(s));
        Pop(s);
    }
    Pop(s);
    return 0;
}

栈--数组实现

时间: 2024-12-27 21:02:47

栈--数组实现的相关文章

栈——数组实现

引言: 使用链表实现栈存在"对malloc和free的调用开销昂贵"的缺点,特别是与指针操作的例程相比尤其如此.利用数组实现栈可以避免了指针.但它的缺点是可能存在空间的浪费. 分析描述: 数组栈的结点元素. #ifndef ERROR #define ERROR (0) #endif #ifndef OK #define OK (!ERROR) #endif #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef in

栈的基础操作——2,8,16进制的入栈——数组类型定义

#define stack_init_size 100 #define stackincrement 10 typedef int ElemType; typedef int status; const status error=0; const status ok=1; const status overflow=-2; const int MAXSIZE = 100; typedef struct { ElemType elem[MAXSIZE]; int top; } SqStack; s

【数据结构】栈-数组的实现

首先是定义栈的基本结构,由于用数组实现 private String[] stack; private int TOP = 0; 然后是构造方法 StackOfStrings(int capacity) { stack = new String[capacity]; } 然后是push,注意,TOP永远指向的是压入元素的后一位. public void push(String str) { if (TOP == stack.length) // if full, increase the sta

栈———数组实现

栈(stack)是一种比较基础的数据结构,其限制了删除和插入在一个位置操作,而其主要思想就是后进先出(LIFO). 具体细节可通过代码看出. 下面给出函数的声明部分: StackRecord.h #ifndef STACKRECORD_H #define STACKRECORD_H typedef char ElementType; struct StackRecord; typedef struct StackRecord *Stack; int IsEmpty(Stack S); int I

顺序栈(数组实现)

上面代码实现了Stack的 isEmpty(),isFull(),clear(),push(),pop(),peek()方法.顺序栈,必须要同时检查下溢出(underflow)和上溢出(overflow). public class Stack { private int[] stack; private static final int defaultSize = 100; private int size; private int topIndex; public Stack() { set

栈和队列常见题型(java版)

直接上干货..... 栈和队列常见题型: 实现栈和实现队列. 两个栈实现一个队列. 设计栈,使得pop,push和min时间复杂度为O(1). 滑动窗口的最大值. 栈的进出序列. 实现栈和实现队列 主要包括:栈,队列,循环队列. package com.sywyg; /** * 实现栈 * 数组应该是Object类型的 * 注意top的设置影响出栈和获取栈顶元素. * size也可以用top代替 */ class MyStack<E>{ // 栈元素个数 private int size; /

实现O(1)获取最大最小值的栈----java

                                实现O(1)获取最大最小值的栈和队列----java 一.如何实现包含获取最小值函数的栈 问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数.在该栈中,调用getMin.push及pop的时间复杂度都是O(1). 最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值:stack1元素出栈时,stack2也出栈一个元素.最小值从s

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步

java代码实现栈

1.栈的定义: 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针.栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退