栈的链式存储

栈的链式存储

题目

设计一个栈的数据结构,使用链表实现栈的基本操作。栈的操作包括:

  1. push(int val):将元素 val 推入栈中。

  2. pop():移除栈顶的元素。

  3. top():获取栈顶的元素。

  4. isEmpty():检查栈是否为空。

输入格式

• 多行输入,每行包含一个操作。

​ •push(val):推入元素 val

​ • pop():移除栈顶元素。

​ •top():获取栈顶元素。

​ •isEmpty():检查栈是否沩空。

输出格式

•对于 top()操作,输出栈顶的元素。

• 对于 isEmpty()操作,输出 truefalse,表示栈是否为空。

输入样例

push(1)
push(2)
push(3)
top()
pop()
top()
isEmpty()
pop()
isEmpty()

输出样例

3
2
false
true

解答

回答重点

题目要求我们设计一个栈的数据结构,并使用链表来实现栈的基本操作。

使用这种数据结构的好处是可以动态地调整栈的大小,而不需要预先定义栈的容量。我们需要实现以下四个方法:

  1. push(int val):将元素 val 推入栈中。

  2. pop():移除栈顶的元素。

  3. top():获取栈顶的元素。

  4. isEmpty():检查栈是否为空。

扩展知识

栈是一种后进先出(LIFO,Last-In-First-Out)的数据结构,即最新被推入栈的元素会最先被弹出。与数组实现不同,使用链表实现的栈不会因为栈的动态变化而需要进行内存调整,因此比较灵活。

C++代码

#include 
using namespace std;


class StackNode{
public:
    int val;
    StackNode* next;
    StackNode(int x):val(x),next(nullptr){}
};

class LinkedListStack{
private:
    StackNode *top; //栈顶

public:
    LinkedListStack(){
        top = nullptr;
    }

    void push(int val){
        StackNode *newNode = new StackNode(val);
        newNode->next = top;
        top = newNode;
    }

    void pop(){
        if(top != nullptr){
            StackNode *temp = top;
            top = top->next;
            delete temp;
        }
    }
    int topVal(){
        if(top != nullptr){
            return top->val;
        }
        cout<<"栈是空的"<<endl;
        return -1;

    }

    bool isEmpty(){
        return top == nullptr;
    }

};

int main(){
    LinkedListStack stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);

    cout<<"栈顶元素:"<<stack.topVal()<<endl;
    stack.pop();
    stack.pop();
    cout<<"栈顶元素:"<<stack.topVal()<<endl;
    stack.pop();
    stack.pop();
    cout<<"栈顶元素:"<<stack.topVal()<<endl;
    cout<<"栈是否为空"<<stack.isEmpty()<<endl;
}


python代码

class StackNode:
    def __init__(self, val):
        self.val = val
        self.next = None

class LinkedListStack:
    def __init__(self):
        self.top = None

    def push(self, val):
        new_node = StackNode(val)
        new_node.next = self.top
        self.top = new_node
    
    def pop(self):
        if self.top:
            popped_val = self.top.val
            self.top = self.top.next
            return popped_val
        raise RuntimeError("Stack is Empty")
    
    def peek(self):  
        if self.top:
            return self.top.val
        raise RuntimeError("Stack is Empty")
    
    def is_empty(self):
        return self.top is None


if __name__ == "__main__":
    stack = LinkedListStack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    print(stack.peek())
    stack.pop()
    stack.pop()
    print(stack.is_empty())
    stack.pop()
    print(stack.is_empty())

你可能感兴趣的:(算法训练营,java,python,开发语言)