22计算机408考研—数据结构—栈

185 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

2022计算机考研408—数据结构—线性表、栈、队列、数组 手把手教学考研大纲范围内的线性表、栈、队列、数组 22考研大纲数据结构要求的是C/C++,笔者以前使用的都是Java,对于C++还很欠缺, 如有什么建议或者不足欢迎大佬评论区或者私信指出

Talk is cheap. Show me the code. 理论到处都有,代码加例题自己练习才能真的学会

和顺序表有点类似
他只能返回栈顶元素,添加栈顶元素
#include "iostream"

using namespace std;
#define MAXSIZE 100     //设置栈的大小
typedef struct {        //栈结构体:栈顶指针,栈底指针,栈的容量
    int *base;
    int *top;
    int stacksize;
}SqStack;

bool InitStack(SqStack &S) {    //初始化栈
    S.base = new int[MAXSIZE];  //创建MAXSIZE大小的空间
    if (!S.base) {  //如果没创建成功返回false
        return false;
    }
    S.top = S.base; //当前栈没有内容,栈顶和栈底指向一个位置
    S.stacksize = MAXSIZE;  //栈的容量为MAXSIZE
    return true;
}

bool Push(SqStack &S, int data) {   //把data入栈
    if (S.top - S.base == S.stacksize) {    //如果栈顶-栈底==栈的容量,证明栈满了,无法添加数据
        return false;
    }
    *S.top++ = data;    //top指针位置添加元素,top指向后一个位置
    return true;
}

bool Pop(SqStack &S, int &data) {   //出栈,返回值给data
    if (S.top == S.base) {      //如果栈顶和栈底指向同一个位置,说明栈内没元素
        return false;
    }
    data = *--S.top;        //top指针前移,把值给data
    return true;
}

bool Peek(SqStack &S, int &data) {  //peek返回值给data,但栈内不删除
    if (S.top != S.base) {
        data = *(S.top - 1);    //返回top指针前一个位置的值给data
        return true;
    }
    return false;
}

bool StackPrint(SqStack S) {    //输出栈内元素,这里传的不是地址,如果传地址用完还要把指针改到栈顶
    while (S.top != S.base) {   //只要栈顶和栈底不是同一个位置,证明栈内元素没有空
        cout << *--S.top << " ";
    }
    cout << "\n";
}

int main() {
    SqStack stack;
    InitStack(stack);   //初始化
    Push(stack,10);
    Push(stack,30);
    Push(stack,20);
    Push(stack,50);
    StackPrint(stack);
    int val;
    Pop(stack, val);    //出栈
    cout << val << " \n";
    StackPrint(stack);
    Peek(stack, val);   //返回栈顶的值,不删除
    cout << val << " \n";
    StackPrint(stack);
    return 0;
}
  

在这里插入图片描述

栈实现括号问题

给定一个字符串,里边可能包含( ) 这一种种括号,请编写程序检查该字符串的括号是否成对出现。

#include "iostream"
#include "stack"

using namespace std;

int main() {
    stack<char> s;  //栈存左括号,当前括号为左括号就压栈,如果遇到右括号就弹出一个左括号
    string str;
    cin >> str;     //输入字符串
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '(') {    //遇到左括号就压栈
            s.push('(');
        } else {    //遇到右括号就出栈,就是一个左括号配对一个右括号
            if (s.size() == 0) {    //如果此时没有左括号,在弹出说明左括号不足,无法匹配括号
                cout << "无法匹配————右括号多了";
                return 0;
            }
            s.pop();
        }
    }
    if (s.size() != 0) {    //如果循环完成后,栈内还有左括号,证明左括号多了,无法完成匹配
        cout << "无法匹配————左括号多了";
    } else {
        cout << "可以匹配";
    }

    return 0;
}