码迷,mamicode.com
首页 > 其他好文 > 详细

顺序栈与链表栈的实现

时间:2016-02-29 00:48:04      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:c语言、栈   链表   

    栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种“先进后出”的操作模式。向栈内进数据称为压栈(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

顺序栈与链表栈的实现

标签:c语言、栈   链表   

原文地址:http://10274409.blog.51cto.com/10264409/1745822

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!