用C++写一个栈

 用C++写一个栈

- 顺序栈

//main.cpp
#include "Stack.h"
int main() {
    SqStack *stack_1;
    Stack_1 test_1;
    int temp_1;
    test_1.initStack(stack_1);
    test_1.push(stack_1 , 2);
    test_1.push(stack_1 , 1);
    test_1.push(stack_1 , 2);
    test_1.push(stack_1 , 3);
    test_1.push(stack_1 , 5);
    test_1.pop(stack_1,0);
    temp_1 = test_1.getTop(stack_1);
    cout << "TOP:"<<  temp_1 << endl;
    test_1.destroyStack(stack_1);
    test_1.push(stack_1 , 2);
    test_1.push(stack_1 , 1);
    test_1.push(stack_1 , 2);
    test_1.push(stack_1 , 3);
    test_1.push(stack_1 , 5);
    test_1.display(stack_1);
    return 0;
}

//Stack.h
#include <iostream>
using namespace std;
struct SqStack{
//    int *data = new int[5];
    int data[5];
    int top;
};
class Stack_1{
private:
public:
    void initStack(SqStack * &stack);//类型是因为其实它就是个数组而已
    void destroyStack(SqStack * &stack);

    bool emptyStack(SqStack *stack);
    bool foolStack(SqStack *stack);
    bool push(SqStack* &stack,int num);//之所以是bool类型,是因为&的直接操作
    bool pop(SqStack* &stack ,int num);

    int getTop(SqStack *stack );
    void display(SqStack *stack);
};

struct shareStack{
    int *data = new int[10];
    int top_1,top_2;
};
class Stack_2{
private:
public:
    void initStack(shareStack * &stack);//类型是因为其实它就是个数组而已
    void destroyStack(shareStack * &stack);

    bool emptyStack(shareStack *stack);
    bool foolStack(shareStack *stack);
    bool push(shareStack *stack,int num);
    bool pop(shareStack *stack ,int num);

    int getTop(shareStack *stack );
    void display(shareStack *stack);
};
//Stack.cpp
//
// Created by 33559 on 2022/11/17.
//
#include "Stack.h"

void Stack_1::initStack(SqStack *&stack){
    stack = new SqStack;
    stack->top = -1;
}

void Stack_1::destroyStack(SqStack *&stack) {
    delete [] stack;
    stack = new SqStack;
    stack ->top = -1;
}

bool Stack_1::emptyStack(SqStack *stack) {return stack->top == -1 ;}
//        return stack->top == -1 ? true : false;
//-- 上下等效会报警告,表达可以简化
bool Stack_1::foolStack(SqStack *stack) {return stack->top == 4;}

int Stack_1::getTop(SqStack *stack) {
    if (stack->top == -1) return 0;
    return stack->data[stack->top];
}

bool Stack_1::push(SqStack* &stack, int num) {
    if (foolStack(stack)) return false;
    stack ->top++;
    stack->data[stack->top] = num;
    return true;
}
bool Stack_1::pop(SqStack* &stack, int num) {
    if (emptyStack(stack)) return false;
    stack->data[stack ->top] = num;
    stack -> top --;
    return true;
}//弹栈顶

void Stack_1::display(SqStack *stack) {
    cout <<" Stack:" << " ";
    while(stack ->top != -1)
        cout << stack->data[stack->top--];
}
//stack->top + 1
//0,1,2已存三个数据,但是条件为i < 2 -- 循环2次 所以要加1

- 共享栈

//Stack.h
#ifndef STACKANDQUEUE_STACK_H
#define STACKANDQUEUE_STACK_H
#include <iostream>
#include <malloc.h>
using namespace std;
struct shareStack{
    int *data = new int[10];
    int top_1,top_2;
};

class Stack_2{
private:
public:
    void initStack(shareStack * &stack);//类型是因为其实它就是个数组而已
    void destroyStack(shareStack * &stack);

    bool emptyStack_1(shareStack *stack);
    bool emptyStack_2(shareStack *stack);
    
    bool foolStack_1(shareStack *stack);
    bool foolStack_2(shareStack *stack);

    bool push_1(shareStack *&stack,int num);
    bool push_2(shareStack *&stack,int num);

    bool pop_1(shareStack *&stack ,int num);
    bool pop_2(shareStack *&stack ,int num);

    int getTop_1(shareStack *stack );
    int getTop_2(shareStack *stack );

    void display_1(shareStack *stack);
    void display_2(shareStack *stack);

};
#endif //STACKANDQUEUE_STACK_H

- 链栈

//main.cpp
#include "Stack.h"
int main(void)
{
    StackNode *stack_3;
    Stack_3 test_3;
    int num;
    test_3.initStack(stack_3);
    if (test_3.emptyStack(stack_3))
        cout << "Yes" << endl;
    test_3.push(stack_3,1);
    test_3.push(stack_3,3);
    test_3.push(stack_3,2);
    test_3.push(stack_3,4);
    test_3.pop(stack_3,0);
    num = test_3.getTop(stack_3);
    cout << num << endl;
//    test_3.destroyStack(stack_3);
    test_3.display(stack_3);

    return 0;
}

#ifndef STACKANDQUEUE_STACK_H
#define STACKANDQUEUE_STACK_H
#include <iostream>
#include <malloc.h>
using namespace std;
struct StackNode{
    int data ;
    StackNode *next;
};

class Stack_3{
private:
public:
    void initStack(StackNode * &stack);//类型是因为其实它就是个数组而已
    void destroyStack(StackNode * &stack);

    bool emptyStack(StackNode *stack);
    bool push(StackNode *stack,int num);
    bool pop(StackNode *stack ,int num);

    int getTop(StackNode *stack );
    void display(StackNode *stack);
};
#endif //STACKANDQUEUE_STACK_H
//Stack.cpp
#include "Stack.h"

void Stack_3::initStack(StackNode *&stack) {
    stack = new StackNode;
    stack->next = nullptr;//不写死循环
}

void Stack_3::destroyStack(StackNode *&stack) {
    StackNode *delP,*prev;
    delP = stack;
    prev = stack->next;
    while(stack != nullptr)
    {
        delete delP;
        delP = prev;
        prev = delP ->next;
    }
    stack ->next = nullptr;
}

bool Stack_3::push(StackNode *stack, int num) {
    StackNode *temp = new StackNode;
    temp ->data = num;
    temp ->next = stack->next;
    stack ->next = temp;
    return true;
}

bool Stack_3::pop(StackNode *stack, int num) {
    /*StackNode *temp ;
    if (stack ->next == nullptr) return false;
    temp = stack ->next;
    num = stack ->data;//提取值 -- 写不写都行
    stack ->next = temp ->next;
    delete temp;*/
    while(stack->next)
    {
        pop(stack,0);
    }
    stack->next = nullptr;
}

int Stack_3::getTop(StackNode *stack) {
    if (stack->next == nullptr) return 0;
    return stack->next->data;
}

bool Stack_3::emptyStack(StackNode *stack) {
    if (stack->next == nullptr)
        return true;
}

void Stack_3::display(StackNode *stack) {
    stack = stack ->next;
    while(stack)
    {
        cout << stack->data <<" ";
        stack = stack ->next;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值