栈结构的基本实现

栈结构实现C语言

  1. FILO,先入栈的元素后出栈。
  2. 栈顶标记

基本操作有:入栈,出栈,获取栈顶元素,判断栈是否为空。

数组栈,链式栈。

链式栈的具体实现代码

#include <stdio.h>
#include <stdlib.h>
//链式栈数据结构
//
/**
 * 用栈顶标识链表的表头
 * 链表的头插法,就是入栈操作
 */
/*typedef struct LNode{
    int data;
    struct LNode* next;
}LinkList ,*LNode;*/
struct LNode{
    int data;
    struct LNode* next;
};

struct Stack{
    struct LNode* stacktop;//栈顶标记
    int size;//栈中的元素个数
};
//创建栈就是创建栈的结构体变量
struct Stack* create_stack(){
    //创建过程其实就是初始化过程
    struct Stack* MyStack = (struct Stack*)malloc(sizeof(struct Stack));//分配初始空间
    MyStack -> stacktop = NULL;
    MyStack -> size = 0;
    return MyStack;
}
//我们需要创建节点
struct LNode* create_node(int data){
    struct LNode* node = (struct LNode*)malloc(sizeof(struct LNode));
    node->data = data;
    node->next = NULL;
    return node;
}
//入栈操作(节点进入栈)
void push_stack(int data,struct Stack* MyStack){
    struct LNode* newNode = create_node(data);
    if(MyStack -> stacktop == NULL){
        MyStack->stacktop = newNode;
    }else{
        newNode->next = MyStack->stacktop;
        MyStack->stacktop = newNode;
    }
    MyStack->size++;
    printf("入栈成功\n");
}
//出栈操作,传入一个是执行出栈操作的栈,另一个是存放出栈节点data的temp
void pop_stack(struct Stack* MyStack,int temp){
    if(MyStack->size == 0){
        printf("栈为空\n");
    }else if (MyStack->stacktop->next == NULL){
        MyStack->size--;
        printf("最后一个元素出栈成功\n");
    }else {
        MyStack->stacktop = MyStack->stacktop->next;
        temp = MyStack->stacktop->data;
        MyStack->size--;
        printf("出栈成功,出栈节点值保存在temp中\n");
    }
}
void print_stack(struct Stack* MyStack){
    struct Stack* temp = MyStack;
    while (temp->stacktop){
        printf("%d\n",temp->stacktop->data);
        temp->stacktop = temp->stacktop->next;

    }
}
int isempty(struct Stack* MyStack){
    if (MyStack->size == 0){
        return 1;//返回1则为空
    }else return 0;//返回0则不为空
}
int main() {
    struct Stack* MyStack = create_stack();
    int temp;
    push_stack(1,MyStack);
    push_stack(2,MyStack);
    push_stack(3,MyStack);
    push_stack(4,MyStack);
    printf("现在栈中的元素有%d个\n",MyStack->size);
    //print_stack(MyStack);
    pop_stack(MyStack,temp);
    pop_stack(MyStack,temp);
    pop_stack(MyStack,temp);
    pop_stack(MyStack,temp);
    printf("现在栈中的元素有%d个\n",MyStack->size);
    //具体实现方法很简单,不管用循环与否都可
    return 0;
}

数组栈的初始化,入栈以及出栈操作C语言实现

#include <stdlib.h>
#define MAX 10
/**
 * 数组栈要定义的属性和方法:
 * 栈指针,栈顶索引,栈的MAX值
 * @return
 */
 struct Array_Stack{
     int *MysStack;//作为数组指针,用来存储数组栈中的元素
     int StackTop;
 };
 //创建初始化数组栈
 struct Array_Stack* createStack(){
     struct Array_Stack* array_stack = (struct Array_Stack*)malloc(sizeof(struct Array_Stack));
     //栈的容量
     array_stack->MysStack = (int *)malloc(sizeof(int)*MAX);
     //栈的标记正好等于数组下标,则没有元素时标记为-1
     array_stack->StackTop = -1;
     return array_stack;
 }
 //入栈操作
 void push(struct Array_Stack* array_stack,int data) {
     array_stack->MysStack[++array_stack->StackTop] = data;
     printf("入栈成功");
 }
 void pop(struct Array_Stack* array_stack){
     if(array_stack->StackTop == -1){
         return;
     }else{
         free(array_stack->MysStack[array_stack->StackTop]);
         array_stack->StackTop--;
     }
 }
int main(){
    struct Array_Stack* stack = createStack();
    push(stack,1);
    push(stack,2);
    push(stack,3);
    push(stack,4);
    return 0 ;
}

便于各个方法实现,和理解数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值