栈是一种先入后出的数据结构,应用也非常广泛,例如在电脑中文件管理里,点击进入多层文件里,然后点返回键,又能回到原处。双击进入相当于入栈,返回相当于出栈,返回时只能返回到当前级的上一级。
栈的存储结构与链表一样,有顺序存储结构和链式存储结构,先来谈一谈顺序存储结构,可以用数组来实现顺序栈,数组下标为0的一端为栈底,再定义一个变量top,用来指向栈顶元素。所以top的值必须小于数组的长度,数组的第一个下标为0,所以top等于0是表示栈只有一个元素。若栈为空,将其判定条件定义为top等于-1。
下面给出顺序栈部分功能实现的代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef struct{
int data[MAXSIZE];
int top;
}SqStack;
void visit(int c){
printf("%d ", c);
}
void StackTraverse(SqStack S){
int i = 0;
while (i <= S.top){
visit(S.data[i++]);
printf("\n");
}
}
void InitStack(SqStack *S) //初始化操作,建立一个空栈
{
S->top = -1;
}
void ClearStack(SqStack *S) //将栈清空
{
S->top = -1;
}
bool StackEmpty(SqStack S) //判断栈是否为空
{
if (S.top == -1)
return false;
else
return true;
}
void Top(SqStack S, int *e) //返回栈顶元素
{
if (S.top == -1) //栈为空
exit(0);
else
*e = S.data[S.top];
}
void Push(SqStack *S, int e) //入栈操作
{
if (S->top == MAXSIZE - 1)
exit(0);
else
S->top++;
S->data[S->top] = e;
}
void Pop(SqStack *S, int *e) //出栈操作
{
if (S->top == -1)
exit(0);
else
*e = S->data[S->top];
S->top--;
}
int StackLength(SqStack S){
return S.top + 1;
}
int main(){
SqStack s;
int i=0;
InitStack(&s);
for (i = 0; i < 10; i++){
Push(&s, i);
}
StackTraverse(s);
int e;
Top(s,&e);
printf("%d\n", e);
Pop(&s, &e);
StackTraverse(s);
system("pause");
return 0;
}