数据结构——堆栈
宗旨:技术的学习是有限的,分享的精神是无限的。
1、特性:先进后出(FILO)
2、应用:
子程序的调用
处理递归调用
表达式转换与求值
二叉树的遍历
图形的深度优化优先
3、用数组仿真堆栈
(1)堆栈数组结构
char stack[MAX_SIZE]; //堆栈的最大容量
int top = -1; //-1表示堆栈为空,随着堆栈中数据量的变动改变指向顶端的位置
(2)数据的存取
数据输入堆栈【push】:栈顶指针top+1;若top小于MAX_SIZE,则数据存入top所指的数组元素中,否则堆栈已满,无法存入数据。
void push(int value)
{
if(top >= MAX_SIZE) //堆栈已满
{
printf("stackis full!\n");
}
else
{
top++;//堆栈指针+1
stack[top] = value; //将数据压入栈中
}
}
数据输出堆栈【pop】:若堆栈指针索引大于0(堆栈未空),则取出目前栈顶指针top所指数组内容;top-1指向下一个堆栈元素。
int pop(void)
{
int temp;//暂存从堆栈中取出的数据
int i;
if(top < 0) // 堆栈为空,退出
{
printf("stackis empty!\n");
return -1;
}
temp = stack[top]; //将数据pop出栈
top--;
return temp;
}
4、用链表仿真堆栈
(1)堆栈链表结构
typedef struct node
{
int data;
struct node *next;
} list, *link;
link stack = NULL; //向链表顶端的
(2)数据的存取
数据输入堆栈【push】:建立一个新节点;将新节点的指针指向原来堆栈指针所指的节点;将原来的节点指向新节点。
void push(int value)
{
link new;
new = (link)malloc(sizeof(list));
new-> data = value;
new-> next = stack;
stack = new;
}
数据输出堆栈【pop】:先保留栈头指针stack所指的位置;将堆栈指向下一个节点;取出原堆栈顶端指针所指的节点内容;释放原堆栈顶端指针所指的节点内存。
int pop(void)
{
link pop;
int temp;
if(stack != NULL)
{
pop = stack;
stack = stack -> next;
temp = pop -> data;
free(pop);
return temp;
}
return -1;
}