顺序栈与链表栈的实现

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

以上是关于顺序栈与链表栈的实现的主要内容,如果未能解决你的问题,请参考以下文章

栈的实现代码

Python数据结构系列❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

栈的顺序存储 - 设计与实现 - API实现

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

考研数据结构模板:顺序表链表栈队列

3)数据结构之线性表(栈与队列)