Day13-栈的实现(Java/C/链栈和顺序栈)

概念简述

**栈(stack):**是限定仅在表尾进行插入和删除操作的线性表。
**属性:**我们把允许插入和删除的一端称为栈顶(top)另一端称为底(bottom)不含任何数据元素的栈称为空栈。栈又称为后进先出(LastInFirstOut)的线性表简称LIFO结构。

image-20230925192137551

栈的抽象数据类型

image-20230925192232060

链栈的实现

  • Java实现链栈
public class LinkedListStack<E> implements Stack<E>, Iterable {
    //1.创建内部节点类
    private static class Node<E>{
        E value;
        Node<E> next;
        public Node(E value, Node<E> next) {
            this.value = value;
            this.next = next;
        }
    }
    //2.创建栈中相关的属性
    private Node<E> head = new Node<>(null, null);//头指针
    private int size;//栈的大小
    private int capacity;//栈的容量
    public LinkedListStack(int capacity) {
        this.capacity = capacity;
    }

    /*向栈顶压入元素*/
    @Override
    public boolean push(E value) {
        //1.判断栈中是否为满
        if (isFull()) return false;
        //2.头插法
        head.next = new Node<>(value, head.next);
        //3.栈的大小+1
        size++;
        return true;
    }

    @Override
    public E pop() {
        //1.判断栈中是否为空
        if (isEmpty()) return null;
        E value = head.next.value;
        //2.删除栈顶元素
        head.next = head.next.next;
        size--;
        return value;
    }

    @Override
    public E peek() {
        if (isEmpty()) return null;
        return head.next.value;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean isFull() {
        return size == capacity;
    }

    @Override
    public Iterator iterator() {
        return new Iterator() {
            Node<E> p = head.next;
            @Override
            public boolean hasNext() {
                return p != null;
            }

            @Override
            public Object next() {
                E value = p.value;
                p = p.next;
                return value;
            }
        };
    }
}
  • C语言实现链栈
#include <stdio.h>
#include <stdlib.h>

// 创建节点结构体
typedef struct Node {
    void* value;
    struct Node* next;
} Node;

// 创建栈结构体
typedef struct {
    Node* head;
    int size;
    int capacity;
} LinkedListStack;


LinkedListStack* createLinkedListStack(int capacity) {
    LinkedListStack* stack = (LinkedListStack*)malloc(sizeof(LinkedListStack));
    stack->head = NULL;
    stack->size = 0;
    stack->capacity = capacity;
    return stack;
}

int isFull(LinkedListStack* stack) {
    return stack->size == stack->capacity;
}

int isEmpty(LinkedListStack* stack) {
    return stack->size == 0;
}

int push(LinkedListStack* stack, void* value) {
    if (isFull(stack)) return 0;

    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->value = value;
    newNode->next = stack->head;
    stack->head = newNode;

    stack->size++;
    return 1;
}

void* pop(LinkedListStack* stack) {
    if (isEmpty(stack)) return NULL;

    void* value = stack->head->value;
    Node* temp = stack->head;
    stack->head = stack->head->next;
    free(temp);

    stack->size--;
    return value;
}

void* peek(LinkedListStack* stack) {
    if (isEmpty(stack)) return NULL;

    return stack->head->value;
}

void freeLinkedListStack(LinkedListStack* stack) {
    Node* current = stack->head;
    while (current != NULL) {
        Node* temp = current;
        current = current->next;
        free(temp);
    }
    free(stack);
}

int main() {
    LinkedListStack* stack = createLinkedListStack(5);
    
    int value1 = 10;
    int value2 = 20;
    int value3 = 30;

    push(stack, &value1);
    push(stack, &value2);
    push(stack, &value3);

    printf("Stack size: %d\n", stack->size);

    int* top = (int*)peek(stack);
    if (top != NULL) {
        printf("Stack top value: %d\n", *top);
    }

    int* poppedValue = (int*)pop(stack);
    if (poppedValue != NULL) {
        printf("Popped value: %d\n", *poppedValue);
    }

    freeLinkedListStack(stack);

    return 0;
}

顺序栈的实现

image-20230926195908493

  • Java语言实现
public class ArrayListStack<E> implements Stack<E> {
    //1.创建栈的基本属性
    private E array[];//定义一个数组
    private int top;//定义一个头指针
    @SuppressWarnings("all")
    public ArrayListStack(int capacity) {
        this.array = (E[]) new Object[capacity];
    }

    /*入栈*/
    @Override
    public boolean push(E value) {
        //1.如果栈为满,返回false
        if (isFull()) return false;
        //2.将值入栈,并且将top + 1
        array[top++] = value;
        return true;
    }
    /*出栈*/
    @Override
    public E pop() {
        //1.如果栈为空,返回null
        if (isEmpty()) return null;
        //2.将值删除,并返回删除的值
        return array[--top];
    }
    /*返回栈顶元素*/
    @Override
    public E peek() {
        //1.如果栈为空,返回null
        if (isEmpty()) return null;
        //2.将值删除,并返回删除的值
        return array[top - 1];
    }
    /*判断栈是否为空*/
    @Override
    public boolean isEmpty() {
        return top == 0;
    }
    /*判断栈是否为满*/
    @Override
    public boolean isFull() {
        return top == array.length;
    }
}
  • C语言实现
#include <stdio.h>
#include <stdlib.h>

/*创建一个栈*/
typedef struct Stack{
	int *array;//创建一个数组 
	int top;//创建一个栈顶指针 
	int capacity;
}Stack; 

/*函数方法的声明—————————————*/
Stack* initStack(int capacity);
bool isFull(Stack *stack);
bool isEmpty(Stack *stack);
bool push(int value, Stack *stack);
int poll(Stack *stack);
int peek(Stack *stack);
/*————————————————————*/
int main(){
	Stack *stack = initStack(3);
	push(1, stack);
	push(2, stack);
	push(3, stack);
	printf("%d\n", peek(stack));
} 

/*栈的初始化*/
Stack* initStack(int capacity){
	Stack* stack = (Stack *)malloc(sizeof(Stack));//创建一个栈 
	stack->array = (int *)malloc(sizeof(int) * capacity);
	stack->capacity = capacity;
	stack->top = 0;//设置栈顶为0索引 
	return stack; 
}

/*判断栈是否为空*/
bool isEmpty(Stack *stack){
	return stack->top == 0;
} 

/*判断栈是否为满*/
bool isFull(Stack *stack){
	return stack->top == stack->capacity;
} 

/*入栈*/
bool push(int value, Stack *stack){
	if(isFull(stack)) return false;
	stack->array[stack->top++] = value;
	return true;
}

/*出栈*/
int poll(Stack *stack){
	if(isEmpty(stack)) return -1;
	return stack->array[--stack->top];
}

/*返回栈顶元素*/
int peek(Stack *stack){
	if(isEmpty(stack)) return -1;
	return stack->array[stack->top - 1];
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值