持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}