栈——数组实现

引言:

使用链表实现栈存在“对malloc和free的调用开销昂贵”的缺点,特别是与指针操作的例程相比尤其如此。利用数组实现栈可以避免了指针。但它的缺点是可能存在空间的浪费。

分析描述:

数组栈的结点元素。

#ifndef ERROR
#define ERROR (0)
#endif
#ifndef OK
#define OK	(!ERROR)
#endif

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10

typedef	int SElemType;
typedef struct SqStack{
	SElemType	*base;
	SElemType	*top;
	int			stacksize;
}SqStack, *pStack;
pStack S;

 栈的初始化。

pStack InitStack(pStack S)
{
	S = (pStack)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(S == NULL){
		return ERROR;
	}
	S->base = (SElemType *)S;
	S->top = S->base;
	S->stacksize = STACK_INIT_SIZE;

	return S;
}

入栈操作。

pStack Push(pStack S, SElemType e)
{
	if((S->top - S->base) >= S->stacksize){
		S->base = (SElemType *)realloc(S, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
		if(S->base == NULL)
				return ERROR;
		S->top = S->base + S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top++ = e;
	return S;
}

出栈操作。

SElemType Pop(pStack S)
{
	if(S->top == S->base)
			return 0;
	return *(--S->top);
}

取栈顶元素。

SElemType GetTop(pStack S)
{
	if(S->top == S->base)
			return ERROR;
	return *(S->top - 1);
}

求栈的长度。

int GetLength(pStack S)
{
	int length = 0;
	if(S->top == S->base)
			return 0;
        pStack Tmp = S;
	while(Tmp->top-- != Tmp->base)
			length++;
	return length;
}

栈——数组实现,布布扣,bubuko.com

时间: 2024-12-20 01:15:37

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

栈--数组实现

用数组实现栈避免了使用指针,但是存在的缺陷是必须提前确定数组的大小,一般来说,这并不是太大的问题.: 数组实现栈: 首先定义一个结构,TopOfStack表示栈顶,当TopOfStack为-1时,表示空栈.数组array用于存放栈元素 进栈(push)时  ++TopOfStack 然后把元素加进数组.出栈(pop)时直接 TopOfStack--; c语言实现: #ifndef _stack_h struct stack; typedef struct stack *Stack; typede

栈的基础操作——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),删除则称为退