顺序栈与链表栈的实现
2016-02-28 20:39
453 查看
栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种“先进后出”的操作模式。向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp)。例如压栈顺序为1、2、3、4、5,着出栈的顺序为5、4、3、2、1(只考虑一次性出栈的情况)。
栈按照存储的方式,又分为顺序栈和链表栈。顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高。而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是动态分配内存。顺序栈在使用的过程中可能出现 栈满、栈空的情况,由于链式栈基于链表设计,因此不会有栈满的情况(也会栈空)。
顺序栈:
栈按照存储的方式,又分为顺序栈和链表栈。顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高。而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是动态分配内存。顺序栈在使用的过程中可能出现 栈满、栈空的情况,由于链式栈基于链表设计,因此不会有栈满的情况(也会栈空)。
顺序栈:
//顺序栈 #include <stdio.h> #define SIZE 10 typedef struct Stack { int data[SIZE]; int top; }Stack; //初始化栈 void init_stack(Stack* st) { st->top=-1; } //判断栈是否为空 int is_stack_empty(Stack* st) { if(st->top==-1) return 1; return 0; } //判断栈是否为满 int is_stack_full(Stack* st) { if(st->top==SIZE-1) { return 1; } return 0; } //获取栈顶值 int get_top_value(Stack* st) { if(is_stack_empty(st)) { printf("stack is empty!\n"); return -1; } return st->data[st->top]; } //进栈 void push(Stack* st,int _data) { if(is_stack_full(st)) { printf("stack is full!\n"); return ; } st->top++; st->data[st->top]=_data; } //出栈 int pop(Stack* st) { if(is_stack_empty(st)) { printf("stack is empty!\n"); return -1; } return st->data[st->top--]; } int main(int argc, char const *argv[]) { Stack st; init_stack(&st); int i; for(i=0;i<10;i++) { push(&st,i); } push(&st,23); push(&st,23); printf("topvalue:%d\n",get_top_value(&st)); for(i=0;i<12;i++) { printf("%d\n",pop(&st)); } return 0; }链式栈:
#include <stdio.h> #include <stdlib.h> //定义节点 typedef struct Node { int data; struct Node* next; }Node; typedef struct Stack { Node* top; }Stack; //初始化栈 void init_stack(Stack* st) { st->top=NULL; } //判断栈是否为空 int is_stack_empty(Stack* st) { if(st->top==NULL) { return 1; } return 0; } //获取栈顶值 int get_topvalue(Stack* st) { if(is_stack_empty(st)) { printf("Stack is empty!\n"); return -1; } return st->top->data; } //进栈 void push(Stack* st,int _data) { Node* newnode=(Node*)malloc(1*sizeof(Node)); newnode->data=_data; newnode->next=st->top; st->top=newnode; } //出栈 int pop(Stack* st) { if(is_stack_empty(st)) { printf("Stack is empty!\n"); return ; } Node* temp=st->top; int retvalue=st->top->data; st->top=st->top->next; free(temp); return retvalue; } int main(int argc, char const *argv[]) { Stack st; init_stack(&st); int i; for(i=0;i<16;i++) { push(&st,i+1); } printf("%d\n",get_topvalue(&st)); for(i=0;i<17;i++) { printf("%d\t",pop(&st)); } printf("\n"); return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++基于栈实现铁轨问题
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言