首先请大家预知,在C语言中,一个数组的数组名是一个指针常量,它指向数组第一个元素,比如
#includeint main() { int a[3] = {1, 2, 3}; printf("a数组第1个元素:%dn",*a); printf("a数组第2个元素:%dn",*(a + 1)); printf("a数组第3个元素:%dn",*(a + 2)); return 0; }
控制台输出:
a数组第1个元素:1 a数组第2个元素:2 a数组第3个元素:3
当然平常访问数组值都是通过下标索引,但是请记住,在C语言中,下标索引访问等同于指针间接访问操作。
a[0] == *(a + 0) a[2] == *(a + 2)1.首先定义一个堆栈的接口(stack.h)
#include2.在另一个文件(d_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.最后写一个主函数文件(d_main.c)测试一下堆栈操作#include #include #include static STACK_TYPE *stack; static size_t stack_size; static int top_element = -1; void create_stack(size_t size){ assert( stack_size == 0 ); stack_size = size; stack = malloc( stack_size * sizeof( STACK_TYPE ) ); assert( stack != NULL ); } void destroy_stack(void){ assert( stack_size > 0 ); stack_size = 0; free(stack); stack = NULL; } void push(STACK_TYPE value){ assert( !is_full() ); top_element += 1; stack[top_element] = value; } STACK_TYPE pop(void){ assert( !is_empty() ); return stack[top_element--]; } STACK_TYPE top(void){ assert( !is_empty() ); return stack[top_element]; } int is_empty(void){ return top_element == -1; } int is_full(void){ return top_element == stack_size - 1; } int len(void){ if(is_empty()){ return 0; } else{ return top_element + 1; } }
#include "d_stack.c"
#define T "True"
#define F "False"
int main(){
create_stack(10);
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());
destroy_stack();
return 0;
}
控制台输出为:
栈顶元素为:5 堆栈为空吗?False 堆栈为满吗?False 堆栈现在存储了5个值 堆栈弹出了5 堆栈现在存储了4个值
总结:动态数组实现堆栈比静态数组明显更具优势,可以指定大小,但还有一种操作,没错,就是C语言的特色——链表,接下来,我将运用结构体与指针,实现一个链表节点数据类型,再用这个链表实现堆栈操作。



