栈的基本运算实现

栈(stack)是一种只能在一端进行插入和删除操作的线性表。表中允许进行插入和删除操作的一端称为栈顶。栈顶的当前位置是动态的,由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底。不含数据元素的栈称为空栈。栈的插入操作称为压栈或进栈,栈的删除操作称为退栈或出栈。栈的主要特点是“后进先出(last in
first out,LIFO)
”。

1、 顺序栈

假定栈的元素个数不超过MaxSize,所有的元素都具有同一数据类型ElemType。采用栈指针s建立和使用顺序栈。在由s指向的顺序栈中,栈空的条件是s->top=-1;栈满的条件是s->top=MaxSize-1;元素e进栈操作是先将栈顶指针加1,然后将元素e放入栈顶指针处;出栈操作是先将栈顶指针处的元素取出,然后将栈顶指针减1。

顺序栈的基本运算实现代码如下:

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50
typedef int ElemType;

typedef struct
{
	ElemType data[MaxSize];
	int top;	//栈顶指针
}SqStack;	//顺序栈

void InitStack(SqStack *&s)	//初始化顺序栈
{
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
}

void DestoryStack(SqStack *&s) //销毁顺序栈
{
	free(s);
}

bool StackEmpty(SqStack *s) //判断是否为空栈
{
	return (s->top==-1);
}

bool Push(SqStack *&s, ElemType e)	//压栈
{
	if(s->top==MaxSize-1)	//栈满,栈上溢出
		return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}

bool Pop(SqStack *&s, ElemType &e)	//出栈,注意要使用&e
{
	if(-1==s->top)	//栈空,栈下溢出
		return false;
	e=s->data[s->top];
	s->top--;
	return true;
}

bool GetTop(SqStack *s, ElemType &e)
{
	if(-1==s->top)
		return false;
	e=s->data[s->top];
	return true;
}
int main()
{
	...;
	return 0;
}

2、 链栈

采用链式存储的栈称为链栈,本文采用单链表实现。链栈的优点是不存在栈满上溢的情况。规定栈的所有操作都在单链表的表头进行,头结点为*s,第一个数据结点是栈顶结点,最后一个结点是栈底结点。

在以*s为头结点的链栈中,栈空的条件是s->next==NULL;由于只有在内存溢出时才会出现栈满,而通常不考虑内存溢出的情况,所以在链栈中可以认为不存在栈满的情况;结点*p进栈的操作是在头结点*s之后插入*p结点;出栈的操作是取出头结点之后的结点的data值并剔除该结点。

链栈的基本运算实现代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct linknode
{
	ElemType data;
	struct linknode *next;
}LiStack;

void InitStack(LiStack *&s)	//初始化栈
{
	s=(LiStack *)malloc(sizeof(LiStack));
	s->next=NULL;
}

void DestoryStack(LiStack *&s)	//销毁栈
{
	LiStack *p=s,*q=s->next;
	while(q!=NULL)
	{
		free(p);
		p=q;
		q=q->next;
	}
	free(p);
}

bool StackEmpty(LiStack *s)	//判断是否空栈
{
	return (s->next==NULL);
}

void Push(LiStack *&s, ElemType e)	//压栈(头插法)
{
	LiStack *p;
	p=(LiStack *)malloc(sizeof(LiStack));
	p->data=e;
	p->next=s->next;
	s->next=p;
}

bool Pop(LiStack *&s, ElemType &e)	//出栈
{
	LiStack *p=s->next;
	if(p==NULL)
		return false;
	e=p->data;
	s->next=p->next;
	free(p);
	return true;
}

bool GetTop(LiStack *s, ElemType &e)	//取栈顶元素
{
	if(s->next==NULL)
		return false;
	e=s->next->data;
	return true;
}

int main()
{
	...;
	return 0;
}

几个注意点:

1、 函数的形参采用指针+引用的格式,可以改变实参的值;

2、 代码在VC6.0下实现,后缀名使用.cpp可以排除一些错误,如false和true的未定义,引用符号&的使用等;

3、 栈的应用:逆序输出、语法检查、数制转换、递归等。

Monday, July 28, 2014

栈的基本运算实现

时间: 2024-08-30 08:09:10

栈的基本运算实现的相关文章

【数据结构之顺序栈的基本运算】

//顺序栈 public class OrderStack { //(1)置空栈 void InitStack(SeqStack *S){ S->top = -1; } //(2)判断栈空 int StackEmpty(SeqStack *S){ return S->top == -1; } //(3)判断栈满 int StackFull(SeqStack *S){ return S->top == StackSize-1; } //(4)进栈 void push(S,x){ if(St

C 数据结构之栈和队列

栈:又叫后进先出表,简称为LIFO线性表. 栈的基本运算有六种: 构造空栈:initStack(). 判断栈空:isEmpty(). 判断栈满:isFull(). 进栈: Push().将元素压入栈顶. 出栈: Pop() . 将元素从栈顶弹出. 取栈顶元素:getTop().不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变.栈由其内核的不同,可以分为:顺序栈和链栈      顺序栈的内核是:数组      链栈的内核是:链表 队列 1.1 队列定义  队列(Queue)也是一种运算受限

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

c#栈的习题2

—.单项选择题1.栈和队列具有相同的(    ). A.抽象数据类型     B.逻辑结构     C.存储结构     D.运算2.栈是(). A.顺序存储的线性结构     B.链式存储的非线性结构 C.限制存取点的线性结构     D.限制存储点的非线性结构3.()不是栈的基本操作. A.删除栈顶元素     B.删除栈底元素 C.判断栈是否为空     D.将栈置为空栈4.假定利用数组 a[n] 顺序存储一个栈,用top表示栈顶指针,top==-1表示桟空,并已知栈未满,当元素x进栈时所

数据结构实践——后缀表达式(栈)

本文是针对数据结构基础系列网络课程(3):栈和队列的实现项目. [项目 - 后缀表达式] 利用sqstack.h中栈的基本运算,实现将一个中缀表达式转换为对应的后缀表达式的算法.例如,输入(56-20)/(4+2),输出后缀表达式::56#20#-4#2#+/要求在数字后加#. 参考解答说明: 原理见视频 栈的应用1-表达式求值,还可以参考表达式求值的源码 基于栈结构,将中缀表达式转换为后缀表达式的算法步骤是: 初始化运算符栈op; 将'='进栈; 从exp读取字符ch; while (ch!=

数据结构栈及其用法(C语言实现)

一.栈的定义 栈是限定仅在表尾进行插入或删除操作的线性表.一次对栈来说,表尾端有其特殊的含义,称为栈顶,相应 的,表头端成为栈底.不含元素的空表称为空栈.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 二.栈的特点 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据 ,先进入的数据被压入栈底,最后的数据在栈顶,需要

Java的顺序栈和链式栈

栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出pop操作,每次删除的都是栈顶最新的元素:每次插入(又称"进栈")称为压入push操作. 当栈满的时候,进行push 操作,会上溢,当空栈的时候进行退栈操作的时称为下溢. 上溢是一种出错的情况,下溢可能是正常的情况处理. 堆栈的运算是按照后进先出的原则,简称LIFO. 栈的基本运算定义: i

【数据结构】3. 栈和队列

目录 3.1 栈 3.1.1 栈的基本概念 (1)栈的定义 (2)栈的基本操作 3.1.2 栈的顺序存储结构 (1)顺序栈的实现 (2)栈的基本运算 (3)共享栈 3.1.3 栈的链式存储结构 3.2 队列 3.2.1 队列的基本概念 (1)队列的定义 (2)队列常见的基本操作 3.2.2 队列的顺序存储结构 (1)队列的順序存储 (2)循环队列 (3)循环队列的操作 3.2.3 队列的链式存储结构 (1)队列的链式存储 (2)链式队列的基本操作 3.2.4 双端队列 3.3 栈和队列的应用 3