首页 > 其他分享 >数据结构之栈(c语言版)

数据结构之栈(c语言版)

时间:2024-04-11 11:48:27浏览次数:20  
标签:int 之栈 pop successful push 数据结构 data stack 语言版

栈(stack): 在逻辑上是一种线性存储结构,它有以下几个特点:
1、栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
2、向栈中添加/删除数据时,只能从栈顶进行操作。

栈通常包括的三种操作:push、peek、pop。
push -- 向栈中添加元素。
peek -- 返回栈顶元素。
pop -- 返回并删除栈顶元素的操作。

栈底层可以基于数组(顺序表),也可以基于链表。

基于数组实现的栈,需要满足数组的特点,查询快,不能动态增长。

基于链表实现的栈,可以动态增长,开销大。

一、数组栈

#include<stdio.h>
#include<stdlib.h>

static int *stack=NULL;//指针,指向栈
static int count=0;//栈中元素的数量
static int MAXSIZE=0;//最大容量

void create_stack(int size){//传入栈的容量

    stack=(int *)malloc(size*sizeof(int));//给栈分配空间

    if(!stack){
        printf("stack error!");//确认栈已经创建
        exit(0);
    } 

    MAXSIZE=size;   
    printf("创建成功\n");

}
//判空
int empty(){
    if(count==0){
       return 1; 
    }
    return 0;
}

//判满
int up(){
    if(count==MAXSIZE){
        return 1;
    }
    return 0;
}

//入栈
void push(int e){
    if(up()){
        printf("stack is up!!!");//满了不能入栈
        exit(0);
    }
    stack[count]=e;
    count+=1;
    printf("push successful\n");
}
//出栈
int pop(){
    if(empty()){
        printf("stack is empty!!!");//空了不能出栈
        exit(0);
    }
    
    int s=stack[count];
    count--;
    printf("pop successful\n");
    return s;
}

//遍历
void display(){
    if(empty()){
        printf("Empty Stack!!!");
        exit(0);
    }
    printf("共有%d个元素\n",count);
    for(int i=0;i<count;i++){
        printf("The data is %d\n",stack[i]);
    }
}


//元素数量
int len(){
    return count;
}


//销毁栈
void destory_stack(){
    if(stack){
        free(stack);
    }
    printf("stack aleardy destory!\n");
}


在主函数中测试:

int main(){

    create_stack(10);//create stack,the size equll 10
    push(1);
    push(3);
    push(5);
    push(7);
    push(9);
    push(11);
    push(0);
    display();

    pop();
    pop();
    pop();
    display();
    destory_stack();

}

结果如下:

创建成功
push successful
push successful
push successful
push successful
push successful
push successful
push successful
共有7个元素    
The data is 1  
The data is 3  
The data is 5
The data is 7
The data is 9
The data is 11
The data is 0
pop successful
pop successful
pop successful
共有4个元素
The data is 1
The data is 3
The data is 5
The data is 7
stack aleardy destory!

二、链表栈

链表有单链表,双链表,循环链表等。都可以实现栈,以下就是基于单链表实现的栈。

#include<stdio.h>
#include<stdlib.h>



typedef struct list_stack{
    int data;
    struct list_stack *next;
}Stack;

static int count=0;//长度
static Stack *head=NULL;//头指针
static Stack *tail=NULL;//尾巴指针

//节点初始化的工具
Stack *init(){
    Stack *p=(Stack *)malloc(sizeof(Stack));
    return p;
}



//创建栈
Stack *create_stack(){
    head=init();
    head->data=NULL;
    tail=head;//尾巴指针,作为工作指针
    printf("Stack is created!\n");
    count++;//栈有了头节点
}

//判空
int empty(){
    if(count==0){
       return 1; 
    }
    return 0;
}



//入栈
void push(int e){
    
    Stack *p=init();
    p->data=e;
    tail->next=p;
    tail=p;
    
    count+=1;
    printf("push successful\n");
}
//出栈
int pop(){
    if(empty()){
        printf("stack is empty!!!");//空了不能出栈
        exit(0);
    }
    
    int n=tail->data;
    Stack *p=head;
    for(int i=1;i<count-1;i++){
        p=p->next;
    }
    tail=p;
    count--;
    printf("pop is successful!\n");
    free(tail->next);
    return n;
}

//遍历
void display(){
    if(empty()){
        printf("Empty Stack!!!");
        exit(0);
    }
    printf("共有%d个元素\n",count-1);
    Stack *p=head;
    for(int i=1;i<count;i++){
        p=p->next;
        printf("The data is %d\n",p->data);
    }

}

//销毁栈
void destory_stack(){
    for(Stack *p=head;head!=NULL;){
        head=head->next;
        free(p);
        p=head;
    }
    printf("stack aleardy destory!\n");
}



主函数:

int main(){

    create_stack();
    push(1);
    push(3);
    push(5);
    push(7);
    push(9);
    display();

    pop();
    pop();
    display();
    destory_stack();
}

输出:

               ^
Stack is created!
push successful
push successful
push successful
push successful
push successful
共有5个元素
The data is 1
The data is 3
The data is 5
The data is 7
The data is 9
pop is successful!
pop is successful!
共有3个元素
The data is 1
The data is 3
The data is 5

数据结构与算法学习目录

标签:int,之栈,pop,successful,push,数据结构,data,stack,语言版
From: https://www.cnblogs.com/cgl-dong/p/18128685

相关文章

  • 数据结构之队列(c语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 数据结构之二叉树(c语言版)
    之前的都是线性结构,而树结构在计算机应用中的应用更加广泛。linux中的目录结构,某些数据库的底层存储等,都是采用树结构进行构架的。树的概念线性表是一对一的关系,而树是一对多的关系。树的结点:包含一个数据元素及若干指向子树的分支;孩子结点:结点的子树的根称为该结点的孩子;双......
  • 数据结构之图(c语言版)
    图是比树更复杂的结构,树是一对多的关系,图是多对多的关系。一、基本概念1、定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。2、根据边是否有方向,将图可以划分......
  • 链表(java语言版)
    链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。使用链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域......
  • 排序算法(c语言版)
    排序算法(c语言版)1、插入排序#include<stdio.h>//插入排序,升序voidinsertion_sort(intarr[],intlen){inti,j,key;for(i=1;i<len;i++){key=arr[i];//arr[i]为待插入的元素,保存在key中j=i-1;wh......
  • 数据结构与算法引言
    数据结构与算法引言数据结构和算法是计算机专业重要的基础课程。数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法简单来说就是解决问题的步骤。有了一个个数据结构和算法,我们可以编写出高质量的代码,高性能的产品。数据结构数......
  • C语言简单的数据结构:单链表的有关算法题(1)
    算法题重点在于思路,代码其实并不难,这里的每一题都提供多种思路,大家可以动手写一下,并找到更好的解题方法这里先介绍前三道题目:1.单链表相关经典算法OJ题1:移除链表元素2.单链表相关经典算法OJ题2:反转链表3.单链表相关经典算法OJ题4:链表的中间结点1.单链表相关经典算......
  • C语言简单的数据结构:单链表
    目录:1.单链表的概念及结构2.单链表的实现2.1单链表的定义、创建和打印2.11单链表的定义2.12单链表的创建2.13单链表的打印2.2单链表的头插和尾插2.21尾插2.22头插2.3单链表的头删和尾删2.31尾删2.31头删2.4单链表的查找2.5单链表指定位置的插入和删除2.51指定位置前......
  • (Java)数据结构——排序(第一节)堆排序+PTA L2-012 关于堆的判断
    前言本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。堆排序(HeapSort)概念堆排序是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆),重复......
  • 数据结构:单链表
    一.链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。但是在逻辑结构上是顺序的。链表的结构其实就像的火车:车厢是独立存在的,且每节车厢都有车门。想象⼀下这样的场景,假设每节车厢的车门都是锁......