/*
Ch3 栈和队列
*/
// 实例数据元素:学生
typedef struct {
char id[10];
int age;
double score;
} Student;
/* (顺序)栈 */
// 栈数据结构定义
#define MAX_SIZE 10
typedef struct {
Student *data;
int size;
} Stack;
// 初始化栈
Stack Create() {
Stack stk;
stk.data = new Student[MAX_SIZE];
stk.size = 0;
return stk;
}
// 获取栈顶元素
bool Top(Stack &stk, Student &res) {
if (stk.size == 0) {
return false;
}
int top = stk.size - 1;
res = stk.data[top];
return true;
}
// 弹出栈顶元素
bool Pop(Stack &stk) {
if (stk.size == 0) {
return false;
}
stk.size--;
return true;
}
// 往栈顶压入一个元素
bool Push(Stack &stk, const Student &s) {
if (stk.size == MAX_SIZE) {
return false;
}
int newTop = stk.size;
stk.data[newTop] = s;
stk.size++;
return true;
}
/* 栈的应用:括号匹配 */
#include <stack>
#include <string>
bool IsParenthesesMatch(std::string s) {
std::stack<char> stk;
for (int i = 0; i < s.length(); ++i) {
switch (s[i]) {
case '(':
case '[':
case '{':
stk.push(s[i]);
break;
case ')':
if (stk.empty() || stk.top() != '(') {
return false;
}
stk.pop();
break;
case ']':
if (stk.empty() || stk.top() != '[') {
return false;
}
stk.pop();
break;
case '}':
if (stk.empty() || stk.top() != '}') {
return false;
}
stk.pop();
break;
}
}
return stk.empty();
}
/* 循环队列 */
// 循环队列数据结构
#define M 10
typedef struct {
Student data[M];
int front;
int back; // back表示队尾的下一个空位
} CQueue; // C = Circulative
// 循环队列入队
bool Enqueue_CQ(CQueue &queue, const Student &s) {
int newBack = (queue.back + 1) % M;
if (newBack == queue.front) {
return false; // 头尾相接表示队列满了
}
queue.data[queue.back] = s; // 放入队尾
queue.back = newBack; // 移动back
return true;
}
// 循环队列出队
bool Dequeue_CQ(CQueue &queue) {
if (queue.front == queue.back) {
return false; // 头尾重合表示队列为空
}
queue.front = (queue.front + 1) % M;
return true;
}
// 求循环队列元素个数
int GetSize(CQueue &queue) {
int size = (queue.back - queue.front + M) % M;
return size;
}
数据结构与算法--栈和队列代码实现(C语言)
最新推荐文章于 2023-01-05 21:13:15 发布