顺序栈定义
typedef struct
{
int data[MAX]; // 存放栈中元素
int top; // 栈顶指针
} SqStack; //顺序栈类型定义
顺序栈示意图如下:
链栈结点定义
typedef struct LNode
{
int data; // 数据项
struct LNode *next; // 指针域
}LNode; //链栈类型定义
链栈就是采用链表来存储栈。这里用带头结点的单链表来作为存储体,示意图如下:
顺序队列的定义
typedef struct
{
int data[MaxSize];
int front; //队首指针
int rear;//队尾指针
}SqQueue;//顺序队类型定义
链队的定义
队结点类型定义
typedef struct QNode
{
int data; //数据域
struct QNode *next; //指针域
}QNode; //结点类型定义
链队类型定义
typedef struct
{
QNode *front;//队头指针
QNode *rear;//队尾指针
}LiQueue;//链队类型定义
链队示意图如下:
顺序栈的基本算法操作
顺序栈的要素
对于顺序栈st,一共有4个要素,包括两个特殊状态,两个操作。
(1)两状态:
①栈空状态st.top==-1(有的书上规定st.top==0为栈空条件,这样会浪费一个元素大小的空间,本书统一规定栈空状态为st.top==-1。)
②栈满状态st.top==MAX-1(MAX为栈中最大元素个数,则MAX-1为栈满时栈顶元素在数组中的位置,因为数组下标从0号开始。本书规定栈顶指针top为-1
时栈空,即top==0的数组位置也可以存有数据元素,这与之前顺序表中规定
0号数组位置不存数据元素是不同的)
(2)两操作:
①元素x进栈操作st.top++;st.data[st.top]=x;
(既然规定了top为-1时栈为空,则元素进栈操作必须是先移动指针,再进入元素,因为数组下表不存在-1。在其他书中因有不同规定,会有先元素进栈再栈顶指针加1的进栈操作,其实本质一样)
②元素x出栈操作x=st.data[st.top];st.top--;
(进栈操作次序决定了出栈操作次序,为什么这样说呢,如果进栈操作是先变动栈顶指针,再存入元素,则出栈操作必须为先取出元素,再变动指针。如果在上述进栈操作不变的情况下先变动指针,再取出元素,则栈顶元素丢失,取出的是栈顶下边的元素。)
初始化栈的算法
初始化一个栈只需将栈顶指针置为-1即可。算法如下:
void initStack(Sqstack &st)//初始化栈
{
st.top=-1; //只需将栈顶指针设置为-1
。
}
判断栈空的算法
栈st为空的时候返回1,否则返回0。对应算法如下:
int StackEmpty(SqStack st)
{
if (st.top==-1)
return 1;
else
return 0;
}
进栈算法
int Push(SqStack &st,int x)
{
if(st.top==MAX-1) //这里要注意,栈满不能进栈。
return 0;
st.top++; //先移动指针,再进栈。
st.data[st.top]=x;
return 1;
}
出栈算法
int Pop(SqStack &st,int &x)
{
if(st.top==-1) //注意,如果栈空则不能出栈
return 0;
x=st.data[st.top]; //先取出元素,再移动指针
st.top--;
return 1;
}
元素x 出栈:
x=stack[top--];
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。