想必你已经看完了我写的堆栈的数组版本,接下来,就好好看看链表怎么实现堆栈吧
1.首先定义一个堆栈接口(stack.h)#include2.在另外一个文件(l_stack.c)中实现具体函数操作#define STACK_TYPE int void push(STACK_TYPE value); STACK_TYPE pop(void); STACK_TYPE top(void); int is_empty(void); int is_full(void); int len(void); void create_stack(size_t size); void destroy_stack(void);
#include "stack.h" #include3.最后编写一个主函数(l_main.c)测试堆栈操作#include #include #include #define False 0 typedef struct STACK_NODE{ STACK_TYPE value; struct STACK_NODE *next; }StackNode; static StackNode *stack; void destroy_stack(void){ // while( !is_empty() ){ // pop(); // } stack = NULL; } void push(STACK_TYPE value){ StackNode *new_node; new_node = malloc(sizeof(StackNode)); assert(new_node != NULL); new_node->value = value; //箭头"->"访问操作符的左边只能为指向结构体的指针 new_node->next = stack; stack = new_node; } STACK_TYPE pop(void){ StackNode *first_node; assert( !is_empty() ); first_node = stack; stack = first_node->next; return first_node->value; } STACK_TYPE top(void){ assert( !is_empty() ); return stack->value; } int is_empty(void){ return stack == NULL; } int is_full(void){ return False; } int len(void){ if(is_empty()){ return 0; } else{ int i = 0; StackNode *find_node; find_node = stack; do{ i++; find_node = find_node->next; }while(find_node != NULL); return i; } }
#include "l_stack.c"
#define T "True"
#define F "False"
int main(){
push(6);
push(3);
push(2);
push(4);
push(5);
printf("栈顶元素为:%dn",top());
printf("堆栈为空吗?%sn",is_empty()?T:F);
printf("堆栈为满吗?%sn",is_full()?T:F);
printf("堆栈现在存储了%d个值n",len());
printf("堆栈弹出了%dn",pop());
printf("堆栈现在存储了%d个值",len());
return 0;
}
控制台输出:
栈顶元素为:5 堆栈为空吗?False 堆栈为满吗?False 堆栈现在存储了5个值 堆栈弹出了5 堆栈现在存储了4个值总结:至此,我已经用静态数组,动态数组,链表共3种方法实现了堆栈,如有不对的地方,欢迎大家指点一二,强烈安利大家去看《C与指针》这本书,很牛逼的。



