栈具有后进先出的特性。
栈的应用:数学表达式求值、函数调用与递归、深度优先搜索、括号匹配等。
1,栈的结构定义
简单起见,定义一个字符栈。
t
o
p
top
top表示栈顶元素的索引。
d
a
t
a
data
data数组用来存储栈的元素。
#define STACKMAXSIZE 100
typedef struct tagSqStack
{
char data[STACKMAXSIZE];
int top;
}SqStack;
2,初始化
使用栈时,必须初始化。对未初始化的栈的操作是未定义的。
当栈为空栈时,令
t
o
p
=
−
1
top=-1
top=−1。
// 栈初始化为空栈
void init(SqStack *stack)
{
stack->top = -1;
}
3,判空
// 判空
int isEmpty(SqStack *stack)
{
return (stack->top == -1) ? 1 : 0;
}
4,判满
// 判满
int isFull(SqStack *stack)
{
return (stack->top == STACKMAXSIZE-1) ? 1 : 0;
}
5,入栈
入栈前必须检查栈是否已满。入栈时,先令 t o p + 1 top+1 top+1,令其指向下一位再赋值。
// 入栈
void push(SqStack *stack, char item)
{
if (isFull(stack))
{
printf("Stack is full!\n");
}
else
{
stack->data[++(stack->top)] = item;
}
}
6,出栈
出栈前要判断栈是否空。非空,则取栈顶元素并令 t o p − 1 top-1 top−1
//出栈
void pop(SqStack *stack, char *item)
{
if (isEmpty(stack))
{
printf("Stack is empty!\n");
}
else
{
*item = stack->data[(stack->top)--];
}
}
7,查询栈顶元素的值
和出栈的代码极其相似,唯一的区别在于,查询时对栈不做修改。
// 查询栈顶元素
void peek(SqStack *stack, char *item)
{
if (isEmpty(stack))
{
printf("Stack is empty!\n");
}
else
{
*item = stack->data[stack->top];
}
}
8,打印栈
将栈按从底到顶的顺序打印。
// 打印栈,从栈底开始
void show(SqStack *stack)
{
if (isEmpty(stack))
{
printf("Stack is empty!\n");
}
else
{
for(int i = 0; i <= stack->top; i++)
{
printf("%c", stack->data[i]);
}
}
printf("\n");
}