数据结构——堆栈
宗旨:技术的学习是有限的,分享的精神是无限的。
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++;//堆栈指针+1stack[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;
}