`
java-mans
  • 浏览: 11428582 次
文章分类
社区版块
存档分类
最新评论

 
阅读更多

栈也是线性结构的一种特例。与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top)。栈是一种先进后出的数据结构。先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶。
栈所提供的操作比一般的线性表要少很多,只提供:初始化、销毁、判断是否为空、求栈的长度、清空栈、将数据压入栈、将数据弹出栈、或得栈顶元素这几种操作。其中将数据压入栈、将数据弹出栈、获得栈顶元素是最重要的。有人可能觉得,将栈顶元素弹出与获得栈顶元素是不是有点重复,其实它们主要的目的在于,很多时候你只想知道当前栈顶的元素是谁,而并不想将它弹出。这样做可以简单一点。
了解了栈的基本结构和操作以后,自然而然的想到用数组来实现栈:因为前面的元素并不发生变化,只能在最后面入栈或者出栈。让我们看看程序:

typedef int ElemType;

typedef struct Stack
{
	ElemType *data;
	//栈顶指针
	ElemType *top;
	//栈的容量
	int stackSize;
	
}Stack;

//初始化一个空栈
bool initStack(Stack *s,int size)
{
	s->data = (ElemType*)malloc(sizeof(Stack)*size);
	if(s->data == NULL)
		return false;
	s->stackSize = size;
	s->top = s->data;
	return true;
}

//销毁栈
void destroyStack(Stack *s)
{
	free(s->data);
	s->data = NULL;
	s->stackSize = 0;
	s->top = NULL;
}

//清空栈
void clearStack(Stack *s)
{
	s->top = s->data;
}

//判断栈是否为空
bool is_empty(Stack *s)
{
	if(s->top == s->data)
	{
		printf("the stack is empty!\n");
		return true;
	}
	else
		return false;
}

//返回栈的长度
int stackLength(Stack *s)
{
	return s->top-s->data;
}

//入栈
bool push(Stack *s,ElemType e)
{
	//如果栈已经满了,重新非配内存
	if(stackLength(s)== s->stackSize)
	{
		s->data = (ElemType *)realloc(s->data,sizeof(Stack)*s->stackSize*2);
		if(NULL == s->data )
			return false;
		s->stackSize *= 2;
	}
	//先将top的位置放入e,再将top位置加1
	*(s->top)++ = e;
	return true;
}

//出栈
bool pop(Stack *s,ElemType *e)
{
	if(is_empty(s))
		return false;
	else
	{
		//将top位置减1,然后返回这个位置的值
		*e = *(--s->top);
		return true;
	}
}

//返回栈顶元素
bool gerHead(Stack *s,ElemType *e)
{
	//如果栈为空,返回错误
	if(is_empty(s))
		return false;
	else
	{
		//top的下一个位置就是栈顶元素
		*e = *(s->top-1);
		return true;
	}

}


感觉简单了不少啊!

栈在在平时很有很多重要的应用,比如当函数调用时,就会用到栈,将当前的数据保存起来,等调用结束以后再弹出。下面举一个简单的例子:10进制到2进制的转化。

int main()
{

	int a = 0;
	int b ,c;
	Stack myStack;
	initStack(&myStack,50);
	printf("please enter a number: ");
	scanf("%d",&a);
	printf("%d in binary system is : ",a);
	do{
		c = a%2;
		a = a/2;		
		push(&myStack,c);
		
	}while(a != 0);
	
	while(!is_empty(&myStack))
	{
		pop(&myStack,&b);
		printf("%d",b);
	}
	destroyStack(&myStack);
	return 0;
}


其实就是把每次除以2的余数先压入栈,然后在弹出,就行了。

我们再三强调,队列和栈都是特殊的线性结构。所以在C++中的STL库中,并没有定义这种类型的容器,而是用“容器适配器”的方法实现了它们。

分享到:
评论

相关推荐

    C语言实现栈操作

    假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1/0和-1)为入栈元素,0表示出栈操作,-1表示操作结束。从...

    C++栈类模板

    C++栈类模板 template class Stack { public: Stack(void); void Push(const T &item;); //将元素item压入栈 T Pop(void); //将栈顶元素弹出栈 void ClearStack(void); T Peek(void)const; //访问栈顶元素 ...

    栈类模板的设计与实现

    进行栈类模板的设计并实现,栈采用链式存储结构,数据元素可以是char,int,float 等多种数据类型,包括以下功能: 实现初始化栈操作,建立一个空栈; (1)实现清空栈操作; (2)实现判断栈是否为空的操作; (3)实现求栈长度...

    顺序栈的各种基本操作

    编写一个程序,实现顺序栈的各种基本运算,并在基础上完成以下功能: 1)初始化顺序栈; 2)判断顺序栈是否为空; 3)依次进栈元素a,b,c,d,e; 4)判断顺序栈是否为空; 5)输出栈长度; 6)输出从栈顶到栈底的元素; 7)...

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    ---------------------------------------------------Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    数据结构实验栈和队列详细实验报告

    (1) 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2) 熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的...

    栈和队列的应用实验 利用栈实现中缀表达式与前缀表达式的转换

    1、掌握顺序栈的类型定义方法。 2、掌握在顺序栈上实现的六种基本算法。 2、掌握顺序栈的简单应用。 二、 实验内容 1、实现一个栈数据结构。 2、利用栈实现中缀表达式与前缀表达式的转换。 三、相关内容介绍 ...

    数据结构顺序栈验证实验报告.pdf

    数据结构实验报告 顺序栈操作验证(参考) 专业: 学号: 姓名: 一、顺序栈操作验证 1. 实验目的 掌握栈的顺序存储结构; 验证栈的操作特性; 掌握栈的基本操作实现方法。 2. 实验内容 建立含有若干个元素的顺序栈...

    数据结构:栈子系统.docx

    数据结构:栈子系统全文共8页,当前为第1页。数据结构:栈子系统全文共8页,当前为第1页。/* 数据结构:栈子系统全文共8页,当前为第1页。 数据结构:栈子系统全文共8页,当前为第1页。 *题目:设计一个字符型的链栈...

    停车场问题 C 栈与队列

    由于在停车场中间的车辆可以提出离开停车场,而且要求在离开车辆到停车场大门之间的车辆都必须先离开停车场,让此车离去,然后再让这些车辆依原来的次序进入停车场,因此在一个栈和一个队列的基础上,还需要有一个...

    java栈实现计算器中缀表达式

    java数字栈和符号栈模拟计算器(中缀表达式) “计算中缀表达式”可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点。可以说...

    创建栈输出栈创建栈输出栈创建栈输出栈

    创建栈输出栈创建栈输出栈创建栈输出栈创建栈输出栈

    顺序栈的C语言实现(栈的顺序存储)

    栈是一种特殊的线性表,它只能在线性表的一端进行插入删除操作,允许插入删除的一端称为栈顶,另一端称为栈底。栈的顺序存储即顺序栈是指,用一块连续的内存来存放一个栈,类似于数组,各元素在内存中是一个挨一个的...

    数据结构栈和队列

    1、理解栈的逻辑结构定义及特点、掌握栈的存储结构的描述、 实现栈的基本运算。 2、理解队列的逻辑结构定义及特点、掌握循环队列存储结构及其描述方法、掌握循环队列的基本运算。 二、实验内容: 1、建立顺序栈,并...

    商店货架管理栈的操作

    商店货架以栈的形式摆放商品,生产日期越近的越靠近栈底,出栈是从栈顶取货,一天营业结束,如果货架不满,则需上货,如果直接将商品摆放到货架上,则会使生产日期越近的越靠近栈顶.这就需要倒货架,仍使生产日期越近...

    栈和队列的基本操作实现及其应用实验报告

    栈和队列的基本操作实验报告 一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容 题目:试写一个算法,判断依次读入的一个以@为结束符的...

    数据结构中栈和队列思想的停车场管理系统

    基于c语言数据结构中栈和队列思想的简单停车场管理系统,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车...

    IT项目管理技术栈.xmind

    IT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT...

    顺序栈相关算法

    1、 定义顺序栈类。 2、 实现如下算法: 1)创建顺序栈; 2)插入操作:向栈顶压入值为 x 的元素; 3)删除操作:弹出栈顶元素,将数据输出在屏幕上; 4)存取操作:读取栈顶元素,将数据输出在屏幕上;。 3、 为了...

    栈的C语言实现

    C语言 栈 顺序栈 数据结构

Global site tag (gtag.js) - Google Analytics