小结:
一、栈的基本定义:是限定仅在表尾进行插入或删除操作的线性表。也叫做后进先出的线性表。
二、栈的表示和实现:
1.顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。
2.链栈:链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
三、栈的应用举例:
1.数制转换
2.括号匹配的检验(2015年考研真题)
3.行编辑程序
4.栈与递归
5.表达式求值
栈的基本操作实现:
栈的结构定义:
typedef struct
{
int * base;
int * top;
int stacksize;
}SqStack;
初始化:
void InitStack(SqStack * s)
{
s->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
进栈:
void Push(SqStack *s, int e)
{
if (s->top - s->base >= s->stacksize)
{
s->base = (int *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(int));
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREMENT;
}
*s->top = e;
s->top++;
}
出栈:
int Pop(SqStack *s)
{
int i;
if (s->top == s->base)
return 0;
s->top--;
i = *s->top;
return i;
}
打印函数:
void Print(SqStack *s)
{
int * temp;
temp = s->top;
while (temp != s->base)
{
temp--;
printf("%d ", *temp);
}
}
主函数:
int main()
{
SqStack S;
InitStack(&S);
int num;
for (int i = 1; i <= 6; i++)
{
scanf("%d", &num);
Push(&S, num);
}
printf("打印栈里的元素:");
Print(&S);
printf("\n");
int n = Pop(&S);
printf("出栈的元素为:%d\n", n);
}
运行结果: