栈也是线性结构的一种特例。与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(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库中,并没有定义这种类型的容器,而是用“容器适配器”的方法实现了它们。
分享到:
相关推荐
假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1/0和-1)为入栈元素,0表示出栈操作,-1表示操作结束。从...
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 中的各种栈:进程栈 线程栈 内核栈 中断栈
(1) 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现; (2) 熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的...
1、掌握顺序栈的类型定义方法。 2、掌握在顺序栈上实现的六种基本算法。 2、掌握顺序栈的简单应用。 二、 实验内容 1、实现一个栈数据结构。 2、利用栈实现中缀表达式与前缀表达式的转换。 三、相关内容介绍 ...
数据结构实验报告 顺序栈操作验证(参考) 专业: 学号: 姓名: 一、顺序栈操作验证 1. 实验目的 掌握栈的顺序存储结构; 验证栈的操作特性; 掌握栈的基本操作实现方法。 2. 实验内容 建立含有若干个元素的顺序栈...
数据结构:栈子系统全文共8页,当前为第1页。数据结构:栈子系统全文共8页,当前为第1页。/* 数据结构:栈子系统全文共8页,当前为第1页。 数据结构:栈子系统全文共8页,当前为第1页。 *题目:设计一个字符型的链栈...
由于在停车场中间的车辆可以提出离开停车场,而且要求在离开车辆到停车场大门之间的车辆都必须先离开停车场,让此车离去,然后再让这些车辆依原来的次序进入停车场,因此在一个栈和一个队列的基础上,还需要有一个...
java数字栈和符号栈模拟计算器(中缀表达式) “计算中缀表达式”可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点。可以说...
创建栈输出栈创建栈输出栈创建栈输出栈创建栈输出栈
栈是一种特殊的线性表,它只能在线性表的一端进行插入删除操作,允许插入删除的一端称为栈顶,另一端称为栈底。栈的顺序存储即顺序栈是指,用一块连续的内存来存放一个栈,类似于数组,各元素在内存中是一个挨一个的...
1、理解栈的逻辑结构定义及特点、掌握栈的存储结构的描述、 实现栈的基本运算。 2、理解队列的逻辑结构定义及特点、掌握循环队列存储结构及其描述方法、掌握循环队列的基本运算。 二、实验内容: 1、建立顺序栈,并...
商店货架以栈的形式摆放商品,生产日期越近的越靠近栈底,出栈是从栈顶取货,一天营业结束,如果货架不满,则需上货,如果直接将商品摆放到货架上,则会使生产日期越近的越靠近栈顶.这就需要倒货架,仍使生产日期越近...
栈和队列的基本操作实验报告 一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容 题目:试写一个算法,判断依次读入的一个以@为结束符的...
基于c语言数据结构中栈和队列思想的简单停车场管理系统,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车...
IT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT项目管理技术栈.xmindIT...
1、 定义顺序栈类。 2、 实现如下算法: 1)创建顺序栈; 2)插入操作:向栈顶压入值为 x 的元素; 3)删除操作:弹出栈顶元素,将数据输出在屏幕上; 4)存取操作:读取栈顶元素,将数据输出在屏幕上;。 3、 为了...
C语言 栈 顺序栈 数据结构