顺序栈与链表栈的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序栈与链表栈的实现相关的知识,希望对你有一定的参考价值。
栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种“先进后出”的操作模式。向栈内进数据称为压栈(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; }
本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1745822
以上是关于顺序栈与链表栈的实现的主要内容,如果未能解决你的问题,请参考以下文章