栈的顺序结构表示

from:shiyanlou

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9 #define INIT_SIZE 20
 10 #define INCREMENT_SIZE 5
 11
 12 typedef int SElemType;
 13 typedef int Status;
 14
 15 /*
 16  * 存储结构
 17  */
 18 typedef struct
 19 {
 20     SElemType *base;    //栈尾指针
 21     SElemType *top;        //栈顶指针
 22     int size;            //栈的大小
 23 }SqStack;
 24
 25 /*
 26  * 初始化栈
 27  */
 28 Status InitStack(SqStack *S)
 29 {
 30     S->base = (SElemType*) malloc(INIT_SIZE * sizeof(SElemType));
 31     if (!S->base)
 32     {
 33         exit(OVERFLOW);
 34     }
 35     S->top = S->base;
 36     S->size = INIT_SIZE;
 37     return OK;
 38 }
 39
 40 /*
 41  * 销毁栈
 42  */
 43 Status DestroyStack(SqStack *S)
 44 {
 45     S->base = NULL;
 46     S->top = NULL;
 47     S->size = 0;
 48     free(S->base);
 49     return OK;
 50 }
 51
 52 /*
 53  * 清空栈
 54  */
 55 Status ClearStack(SqStack *S)
 56 {
 57     S->top = S->base;
 58     return OK;
 59 }
 60
 61 /*
 62  * 判断栈是否为空
 63  */
 64 Status IsEmpty(SqStack S)
 65 {
 66     if (S.top == S.base)
 67     {
 68         return TRUE;
 69     }
 70     else
 71         return FALSE;
 72 }
 73
 74 /*
 75  * 获取栈的长度
 76  */
 77 int GetLength(SqStack S)
 78 {
 79     return (S.top - S.base) / sizeof(SElemType);
 80 }
 81
 82 /*
 83  * 获取栈顶元素
 84  */
 85 Status GetTop(SqStack S, SElemType *e)
 86 {
 87     if (S.top > S.base)
 88     {
 89         *e = *(S.top - sizeof(SElemType));
 90         return OK;
 91     }
 92     else
 93     {
 94         return ERROR;
 95     }
 96 }
 97
 98 /*
 99  * 压栈
100  */
101 Status Push(SqStack *S, SElemType e)
102 {
103     if ((S->top - S->base) / sizeof(SElemType) >= S->size)
104     {
105         S->base = (SElemType*) realloc(S->base, (S->size + INCREMENT_SIZE) * sizeof(SElemType));
106         if (!S->base)
107         {
108             exit(OVERFLOW);
109         }
110         S->top = S->base + S->size * sizeof(SElemType);
111         S->size += INCREMENT_SIZE;
112     }
113     *S->top = e;
114     S->top += sizeof(SElemType);
115     return OK;
116 }
117
118 /*
119  * 退栈
120  */
121 Status Pop(SqStack *S, SElemType *e)
122 {
123     if (S->top == S->base)
124     {
125         return ERROR;
126     }
127     S->top -= sizeof(SElemType);
128     *e = *S->top;
129     return OK;
130 }
131
132 /*
133  * 访问元素
134  */
135 void visit(SElemType e)
136 {
137     printf("%d ", e);
138 }
139
140 /*
141  * 遍历栈
142  */
143 Status TraverseStack(SqStack S, void (*visit)(SElemType))
144 {
145     while (S.top > S.base)
146     {
147         visit(*S.base);
148         S.base += sizeof(SElemType);
149     }
150     return OK;
151 }
152
153 int main()
154 {
155     SqStack S;
156     if (InitStack(&S))
157     {
158         SElemType e;
159         int i;
160
161         printf("init_success\n");
162
163         if (IsEmpty(S))
164         {
165             printf("Stack is empty\n");
166         }
167
168         for (i = 0; i < 10; i++)
169         {
170             Push(&S, i);
171         }
172
173         GetTop(S, &e);
174         printf("The first element is %d\n", e);
175         printf("length is %d\n", GetLength(S));
176         Pop(&S, &e);
177         printf("Pop element is %d\n", e);
178         TraverseStack(S, *visit);
179         if (DestroyStack(&S))
180         {
181             printf("\ndestroy_success\n");
182         }
183     }
184 }

VS2010下的结果:

CODEBLOCKS下的结果:

时间: 2024-12-15 01:41:21

栈的顺序结构表示的相关文章

算法之 栈的顺序结构

package bin; import java.util.ArrayList; import java.util.List; import org.omg.CORBA.SystemException; /** * @author bin * target 实现栈的顺序结构 * 摘要:栈 栈顶 栈底 LIFO 结构 last In First Out */ public class Bin_stack { private int StackSize; private int current; p

数据结构-栈的顺序结构两种方式

第一种结构: 存储空间有限,适用于知道存储长度的情况下.操作实现很简单. 1 #include "stdio.h" 2 3 4 #define MAXSIZE 50 5 #define STACKINCREMENT 10 6 #define OK 1 7 #define ERROR 0 8 typedef int SElemType; 9 typedef int Status; 10 11 typedef struct 12 { 13 SElemType data[MAXSIZE];

栈的顺序结构和链式结构实现

1.栈的顺序存储<数组实现> 1.1.栈的接口 1 package com.neusoft.stack; 2 3 public interface IStack { 4 //1.栈置空 5 public void clear(); 6 //2.栈判空 7 public boolean isEmpty(); 8 //3.栈长度 9 public int length(); 10 //4.取栈顶元素 11 public Object peek(); 12 //5.移除栈顶元素-----出栈 13

顺序结构栈与队列之货物货架管理

#include <iostream>#include<string.h> using namespace std; static int n;       //货架(栈)的最大容量 //信息结构体typedef struct /*Inform*/      //可以去掉Inform,在需要在结构体中定义结构体对象(指针)时不能去掉{    string name;    int a;}Inform; //栈的*顺序*结构体typedef struct{    Inform *ba

07.栈(一)栈的存储结构及操作

一.栈 1.栈(stack):是限定仅在表尾进行插入和删除操作的线性表.其中,允许插入和删除的一端被称为栈顶(top),另一端被称为栈底(bottom),不含任何数据元素的栈被称为空栈.栈又被称为后进先出(Last In First Out)的线性表,简称LIFO结构. 栈的插入操作为进栈,栈的删除操作为出栈. 2.栈的抽象数据类型 ADT 栈(stack) Data 同线性表.元素具有相同类型,相邻元素具有前驱和后继关系. Operation InitStack(*S):初始化操作,建立一个空

栈和队列分别的顺序结构和链式结构

栈和队列 栈和队列本身作为特殊的线性表,要记住他俩本身就费劲.难受的是他俩还能分别考虑顺序结构和链式结构,很复杂,容易混淆. 其实比起FILO(先进后出)和FIFO(先进先出)等特点,更重要的是对指针的把握.进出顺序是在逻辑层面的,只要理解就行,难得是如何用指针来表示这种特点,于是我就此方面进行个总结. 顺序栈 虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满. s.top == s.base; //当栈顶指针等于栈底

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

栈:顺序栈和链式堆栈

一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适用. 二.堆栈的抽象数据类型: 数据集合: 堆栈的数据

栈的顺序表示和实现

栈的顺序存储结构 #define STACK_INIT_SIZE 10 #define STACK_INCREMENT 2 struct SqStack//顺序栈 { SElemType *base;//在栈构造指针之前和销毁之后,base值为NULL SElemType *top;//栈顶指针 int stacksize;//当前已分配的存储空间,以元素为单位 }; 栈的9个基本操作 void InitStack(SqStack &S){//构造一个空栈S S.base = (SElemTyp