栈是限定在只能在尾部操作(插入或删除)的线性表。
栈是按照后进先出的,LIFO。
一般来说,栈应该是无上限的,即如果栈满了,应该可以自动扩充。
定义如下的栈结构:
struct Stack { int* base; int* top; int size; };
注意,top指向的不是栈顶而是栈顶的下一个元素!
当base==NULL或者top==base时,可以认为栈是空的。
基本操作有push、pop、top(取得栈顶元素但不弹出栈)、isempty。
代码如下:
#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACK_INC_SIZE 20 struct Stack { int* base; int* top; int size; }; void stack_init(struct Stack* stack) { stack->size = 0; stack->base = stack->top = NULL; // malloc stack->base = (void*)malloc(sizeof(int)*STACK_INIT_SIZE); if(!stack->base) { return ; } stack->top = stack->base; stack->size = 0; } void stack_free(struct Stack* stack) { if(stack->base) { free(stack->base); } stack->base = stack->top = NULL; stack->size = 0; } void stack_push(struct Stack* stack, int data) { // check if enough stack space if(stack->top - stack->base >= stack->size) { stack->base = (void*)realloc(stack->base, sizeof(int)*(stack->size+STACK_INC_SIZE)); if(!stack->base) { return ; } stack->size += STACK_INC_SIZE; } // Push //*stack->top = data; //stack->top++; *stack->top++ = data; } void stack_pop(struct Stack* stack, int* data) { // Pop //stack->top--; //*data = *stack->top; *data = *--stack->top; } //有Bug!!需要判断栈是否为空! void stack_top(struct Stack* stack, int* data) { // Top if(!stack_isempty(stack)) { *data = *(stack->top-1); } } void stack_print(struct Stack* stack) { int* p = stack->base; while(p!=stack->top) { printf("%d ", *p); p++; } } int stack_isempty(struct Stack* stack) { if(stack->base==NULL || stack->base == stack->top) { return 1; } else { return 0; } } int main() { struct Stack stack; int i; int elem; stack_init(&stack); // IsEmpty printf("IsEmpty:%d\n", stack_isempty(&stack)); // Push for(i=0; i<200; i++) { stack_push(&stack, i); } for(i=0; i<100; i++) { stack_pop(&stack, &elem); } stack_top(&stack, &elem); printf("%d\n", elem); // IsEmpty printf("IsEmpty:%d\n", stack_isempty(&stack)); // Print stack_print(&stack); stack_free(&stack); return 0; }