堆栈(或栈stack)
定义:堆栈(或栈stack)是限定插入和删除运算只能在同一端进行的线性数据结构。是限定插入和删除运算只能在同一端进行的线性数据结构.
描述 :栈是后进先出(last-in-first-out LIFO)的动态线性数据结构.允许插入和删除元素的一端称为栈顶,另一端称为栈底。若栈中无元素,则称为空栈。
S=(a0,a1,…,an-1)
算法伪代码:
ADTStack {
数据:
零个或多个元素的线性序列(a0,a1,...,an-1), 其最 大允许长度为MaxStackSize。对于它插入和删除运算都限制在同一端进行,并遵循LIFO原则。
运算:
Create(): 建立一个空栈。
Destroy():撤消一个栈。IsEmpty():若栈空,则返回true;否则返回 false。
IsFull(): 若栈满,则返回true; 否则返回 false。
Top(x):返回栈顶元素。若操作成功,则返回true;否则返回false。
Push(x): 在栈顶插入元素x。
Pop(): 从栈中删除栈顶元素。
Clear(): 清除堆栈中全部元素。
};
算法如下:C语言实现:
#include "stdio.h"
#ifndef ElemType
#define ElemType int /*在实际应用中,将ElemType定义成实际类型*/
#endif/*typedef int ElemType;*/
#ifndef SQ_Stack /*或 #if !defined(SQ_Stack)*/
#define SQ_Stack
#ifndef MaxSize/*MaxSize未定义过则定义*/
#define MaxSize 100 /*顺序栈的容量,栈存储元素个数*/
#endif
typedef struct{
ElemType data[MaxSize];/*定义存储栈中元素的数组*/
int top; /*栈顶位置*/
}sqStack;
void InitStack(sqStack *S)/*初始化栈*/
{S->top=-1;}
int Empty(sqStack *S)/*判栈空*/
{return S->top==-1?1:0;}
int Full(sqStack *S)/*判栈满*/
{return S->top==MaxSize-1;}
int Push(sqStack *S,ElemType x)/*入栈*/
{if(Full(S))return 0;/*{printf("栈满!\n");}*/
S->data[++S->top]=x;return 1;}
int Pop(sqStack *S,ElemType *x)/*出栈*/
{if(Empty(S))return 0;/*{printf("栈空!");}*/
*x=S->data[S->top--];return 1;}
int GetTop(sqStack *S,ElemType *x)/*取栈顶元素*/
{if(Empty(S))return 0;/*{printf("栈空!");}*/
*x=S->data[S->top];
return 1;}
#endif
C++实现:
#include <iostream.h>
//using namespace std;
#ifndef SQ_Stack2 //或 #if !defined(SQ_Stack)
#define SQ_Stack2
template<class ElemType>
class sqStack{
ElemType *data,X; //定义存储栈中元素的数组
int top,MaxSize; //栈顶位置,顺序栈的容量
public://初始化栈
sqStack(int n=100):top(-1),MaxSize(n),X(0){data=new ElemType[n];}
int Empty(){return top==-1?1:0;}//判栈空
int Full(){return top==MaxSize-1;}//判栈满
int Push(ElemType x)//入栈
{if(Full())return 0;//{printf("栈满!\n");}
data[++top]=x;return 1;}
ElemType Pop()//出栈
{if(Empty())return X;//{printf("栈空!");}
return data[top--];}
ElemType GetTop()//取栈顶元素
{if(Empty())return X;//{printf("栈空!");}
return data[top];}
};
#endif