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

栈(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

数据结构与算法学习目录

posted @ 2024-04-11 11:33  cgl_dong  阅读(50)  评论(0编辑  收藏  举报