数据结构(C实现)------- 顺序栈

栈是限定仅在表的一端进行插入或删除的纯属表,通常称允许插入,删除的一端为栈顶(Top),相应在的,则称另一端为栈底(Bottom)。不含元素的栈则称为空栈。

所设栈S={a1,a2,a3,...,an},则称a1为栈底元素,an为栈顶元素。根据栈的定义可知,栈顶元素总是最后入栈并且最先出栈的;栈底元素总是最先入栈并且最后出栈的。即栈是按后进先出的原则进行的。因此,栈又称为后进先出(LIFO)的线性表。

而顺序栈,即栈的顺序存储结构。它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序表中的位置。类似于顺序表,用一维数据描述顺序中的数据元素的存储区域,而栈顶的位置则是随着插入和删除而变化的,通常将用一个整数表示,将数组下标为0的一端设置为栈底。

顺序栈的类型描述:

#define MAXSIZE 100 //栈的最大空间

//顺序栈类型描述
typedef int ElemType;
typedef struct{
	ElemType data[MAXSIZE];
	int top;
}SqStack;

在顺序栈中,若将数组下标为0的一端设为栈底,则当top的值为-1时,则表示栈空,每次向栈中压入一个元素时,首先便top的值加1,然后再把数据元素在于该位置。每次从栈中弹出一个元素时,首先取出栈顶元素,然后使top的值减1,指示新的栈顶元素。

顺序栈的基本操作:

1. 初始化栈Init_SqStack(SqStack* S)

顺序栈的初始化是要构造一个空的顺序栈。只需要将空顺序栈S中的top置为-1,表示栈中目前并没有数据元素,算法的复杂度为O(1)。

//初始化栈
void Init_SqStack(SqStack* S){
	S->top = -1;
}

2.  判断栈空isEmpty_SqStack(SqStack* S)

因为栈底设置在数组的0下标处,即S->data[0]表示栈底元素,所以空栈时栈顶指针top=-1。若top=-1,则表示栈空,返回1,否则,则表示栈非空,返回0,算法的复杂度为O(1)。

//判断栈空
int isEmpty_SqStack(SqStack* S){
	if(S->top  == -1)
		return 1;
	else
		return 0;
}

3.  判断栈满isFull_SqStack(SqStack* S)

因为设置了栈的最大空间,所以在入栈时必须先判断栈是否已满,即当top= MAXSIZE时,则表示栈满,返回1,否则,则表示栈非空,返回0,算法的复杂度为O(1)。

//判断栈满
int isFull_SqStack(SqStack* S){
	if(S->top  ==  MAXSIZE)
		return 1;
	else
		return 0;
}

4. 入栈 Push_SqStack(SqStack* S,ElemType x)

首先,检测栈是否已满,若是,则输出提示信息,结束,否则,指针top值加1,将元素x存于栈顶位置即可,算法的复杂度为O(1)。

//入栈操作
void Push_SqStack(SqStack* S,ElemType x){
	//栈满,则退出
	if(isFull_SqStack(S)){
		printf("栈满!\n");
		exit(0);
	}
	else{
		S->data[++(S->top)] = x;
	}
}

5. 出栈Pop_SqStack(SqStack* S,ElemType* x)

首先,检测栈是否为空,若是,则输出提示信息,结束,否则,将栈顶元素赋值给x,并将指针top减1,,算法的复杂度为O(1)。

//出栈
void Pop_SqStack(SqStack* S,ElemType* x){
	//如果栈空,则输出提示信息,并退出
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	else
		*x =  S->data[S->top--];
}

6. 读取栈顶元素Top_SqStack(SqStack* S,ElemType* x)

读顶元素与出栈运算都是取得栈顶元素的值,二者的区别在于:读栈顶元素时,栈顶指针不发生变化,仅读取栈顶元素,而出栈还要将栈顶元素删除,此时,栈顶指针也要发生变化,时间复杂度为O(1)

//读取栈顶元素
void Top_SqStack(SqStack* S,ElemType* x){
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	else
		*x = S->data[S->top];
}

7. 输出整个栈Print_SqStack(SqStack* S)

输出栈,只需要从栈顶开始读取到栈底,将栈中所有的数据元素输出即可。

//输出整个栈
void Print_SqStack(SqStack* S){
	if(isEmpty_SqStack(S)){
		printf("栈空!\n");
		exit(0);
	}
	int length = S->top;
	while(length > -1)
		printf("%d\t",S->data[length--]);
	printf("\n");

}
时间: 2024-10-24 22:18:32

数据结构(C实现)------- 顺序栈的相关文章

数据结构:C_顺序栈的实现

数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typedef struct { int *base; int *top; int stacksize; }SqStack; |说明: 1.base表示栈底指针,在判断出栈.初始化和重新分配空间的时候需要用到. 2.top表示栈顶指针,是栈最关键和核心的组成,入栈时top向上移动,出栈时top向下移动. 3.此

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)

数据结构基础(6) --顺序栈的设计与实现

栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, first-out)的策略[下一篇我们着重复习队列]. 栈的示意图: //顺序栈的实现与解析 template <typename

数据结构笔记1顺序栈

#include<stdio.h> #include<conio.h>#include<stdlib.h>#define MAX 100typedef struct{ int data[MAX]; int top;}Stack;Stack s;//初始化 成功1int InitStack(Stack s){ s.top=-1; return 1;}//判空 非空1int StackEmpty(Stack s){ if(-1==s.top)  return 0; retu

数据结构与算法——顺序栈

今天总结栈的顺序存储结构 什么是栈? 栈是一种线性表,其特点是限定尽在表尾进行插入和删除操作,表尾栈一段也叫栈顶,另一端就是栈底了.既然栈是线性表,那么栈也就有两种存储数据的方式,顺序存储和链式存储.今天实现的是顺序存储的栈,也就顺序栈. 图示(来自百度图片): 顺序栈的实现: 栈的顺序存储还是比较简单的,就是对数组进行操作. <span style="font-family:Courier New;font-size:14px;">#include <iostrea

12. C#数据结构与算法 -- 顺序栈

理论基础: 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫空栈(Empty Stack). 栈可以分为顺序栈和链栈. 用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack).类似于顺序表,用一维数组来存放顺序栈中的数据元素.栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1

数据结构复习之顺序栈的实现

#include <stdio.h> #include <stdlib.h> #include <malloc.h> //常量定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //自定义类型 typedef int Status; //函数返回值类型为int typedef int ElemType; //栈元素

数据结构Java实现05----栈:顺序栈和链式堆栈

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

数据结构--顺序栈的实现

最近在看严蔚敏的数据结构,以下是参照 http://blog.csdn.net/WLxinliang/article/details/52894338 手写的顺序栈的实现代码: 1.头文件定义了常数项 //constant.h #include<iostream> #include<string.h> #include<stdlib.h> #include<malloc.h> using namespace std; #define TRUE 1 #defi

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

小猪的数据结构辅助教程--3.1 栈与队列中的顺序栈 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点 1.栈与队列的介绍,栈顶,栈底,入栈,出栈的概念 2.熟悉顺序栈的特点以及存储结构 3.掌握顺序栈的基本操作的实现逻辑 4.掌握顺序栈的经典例子:进制变换的实现逻辑 1.栈与队列的概念: 嗯,本节要进行讲解的就是栈 + 顺序结构 = 顺序栈! 可能大家对栈的概念还是很模糊,我们找个常见的东西来拟物化~ 不知道大家喜欢吃零食不--"桶装薯片"就可以用来演示栈! 生产的时