一、堆栈
1.什么是堆栈?
1)堆栈是具有一定操作约束的线性表,这个操作约束就是只在栈顶(Top)位置做插入(入栈Push)和删除(出栈Pop)的操作,整个过程是后入先出的(LIFO)。
2)堆栈的抽象数据类型描述:
类型名称:
堆栈(Stack)
数据对象集:0个或多个元素的有穷线性表
操作集:长度MaxSize的堆栈S,堆栈元素item任意数据类型ElementType
①Stack CreateStack( int MaxSize )
: 生成空堆栈,其最大长度为MaxSize
②int IsFull( Stack S, int MaxSize )
:判断堆栈S是否已满
③void Push( Stack S, ElementType item )
:将元素item压入堆栈
④int IsEmpty ( Stack S )
:判断堆栈S是否为空
⑤ElementType Pop( Stack S )
:删除并返回栈顶元素
其中最重要的就是压栈和出栈的操作。
2.堆栈的顺序存储
与之前没有操作约束的普通线性表一样,顺序存储采用数组的物理数据结构,相对来说比较简单,注意两种不同的定义方式,一个是静态数组,一个是动态数组:
#include <iostream>
#include <cstdlib>
using namespace std;
#define MaxSize 10
/*程序运行的时候动态创建数组*/
// typedef struct SNode *Stack;
// struct SNode{
// char Data[MaxSize];
// int Top;
// };
/*编译时确定数组长度*/
typedef struct SNode *Stack;
struct SNode
{
char *Data;
int Top;
};
Stack CreateStack()
{
Stack S;
S = (Stack)malloc(sizeof(SNode));
S->Data = (char *)malloc(MaxSize * sizeof(char));
S->Top = -1;
return S;
}
void Push(Stack PtrS, char item)
{
if (PtrS->Top == MaxSize - 1)
{
cout << "Stack FULL" << endl;
return;
}
else
{
PtrS->Data[++(PtrS->Top)] = item;
return;
}
}
char Pop(Stack PtrS)
{
if (PtrS->Top == -1)
{
cout << "Stack NULL" << endl;
return 'N';
}
else
return (PtrS->Data[(PtrS->Top)--]);
}
void TraverseStack(Stack S)
{
if (S->Top == -1)
{
cout << "Stack NULL" << endl;
return;
}
int i = 0</