数据结构实现-栈和队列

顺序栈

cpp 复制代码
#include <iostream>
using namespace std;
#define MaxSize 50

//顺序栈
template<typename ElemType>
struct SqStack{
    ElemType data[MaxSize];
    int top;
};

//初始化
template<typename ElemType>
void InitStack(SqStack<ElemType>&s){
    s.top=-1;
}

//判断栈空
template<typename ElemType>
bool StackEmpty(SqStack<ElemType>&s){
    return s.top==-1;
}

//进栈
template<typename ElemType>
bool Push(SqStack<ElemType>&s,ElemType x){
    if (s.top==MaxSize-1){
        return false;
    }
    s.data[++s.top]=x;
    return true;
}

//出栈
template<typename ElemType>
bool Pop(SqStack<ElemType>&s,ElemType&x){
    if (s.top==-1){
        return false;
    }
    x=s.data[s.top--];
    return true;
}

//读栈顶元素
template<typename ElemType>
bool GetTop(SqStack<ElemType>&s,ElemType&x){
    if (s.top==-1)
        return false;
    x=s.data[s.top];
    return true;
}

链栈

cpp 复制代码
#include <iostream>
using namespace std;
template<typename ElemType>
struct LinkNode{
    ElemType data;
    LinkNode<ElemType>*next;
};
template<typename ElemType>
struct LinkStack{
    LinkNode<ElemType>*front,*rear;
};

//初始化
template<typename ElemType>
void InitStack(LinkStack<ElemType> &S){
    S.front = S.rear = new LinkNode<ElemType>;
}

//判栈空
template<typename ElemType>
bool StackEmpty(LinkStack<ElemType>S){
    return S.front==S.rear;
}

//进栈
template<typename ElemType>
void Push(LinkStack<ElemType>&s,ElemType x){
    LinkNode<ElemType>*newNode = new LinkNode<ElemType>;
    newNode->data=x;
    newNode->next=s.rear;
    s.rear=newNode;
}

//出栈
template<typename ElemType>
bool Pop(LinkStack<ElemType>&s,ElemType&x){
    if (StackEmpty(s)){
        return false;
    }
    LinkNode<ElemType>*temp = s.rear;
    x = temp->data;
    s.rear = s.rear->next;
    delete temp;
    return true;
}

//读栈顶元素
template<typename ElemType>
bool GetTop(LinkStack<ElemType>&s,ElemType&x){
    if (StackEmpty(s))
        return false;
    x = s.rear->data;
    return true;
}

顺序队列

cpp 复制代码
#include <iostream>
using namespace std;
#define MaxSize 10
template<typename ElemType>
struct SqQueue{
    ElemType data[MaxSize];
    int front,rear;
};

//初始化
template<typename ElemType>
void InitQueue(SqQueue<ElemType>&Q){
    Q.front=Q.rear=0;//默认队列的头指针指向对头,尾指针指向尾部元素的下一个。
}

//判队空
template<typename ElemType>
bool isEmpty(SqQueue<ElemType>&Q){
    return Q.front==Q.rear;
}

//入队
template<typename ElemType>
bool EnQueue(SqQueue<ElemType>&Q,ElemType x){
    if ((Q.rear+1)%MaxSize==Q.front){
        return false;
    }
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear+1)%MaxSize;
    return true;
}

//出队
template<typename ElemType>
bool DeQueue(SqQueue<ElemType>&Q,ElemType&x){
    if (Q.rear==Q.front)
        return false;
    x=Q.data[Q.front];
    Q.front = (Q.front+1)%MaxSize;
    return true;
}


int main(){
    SqQueue<int>sq;
    InitQueue(sq);
    for (int i = 0; i < 8; ++i) {
        EnQueue(sq,i);
    }
    int x;
    for (int i = 0; i < 3; ++i) {
        DeQueue(sq,x);
    }
    for (int i = 8; i < 10; ++i) {
        EnQueue(sq,i);
    }
    cout<<endl;
}

链队列

cpp 复制代码
#include <iostream>
using namespace std;
template<typename ElemType>
struct LinkNode{
    ElemType data;
    LinkNode<ElemType>* next;
};
template<typename ElemType>
struct LinkQueue{
    LinkNode<ElemType>*rear,*front;
};

//初始化
template<typename ElemType>
void InitQueue(LinkQueue<ElemType>&Q){
    Q.front = Q.rear = new LinkNode<ElemType>;
    Q.front->next = nullptr;
}

template<typename ElemType>
bool IsEmpty(LinkQueue<ElemType>&Q){
    return Q.front==Q.rear;
}

template<typename ElemType>
void EnQueue(LinkQueue<ElemType>&Q,ElemType x){
    LinkNode<ElemType>*s = new LinkNode<ElemType>;
    s->data = x;
    s->next= nullptr;
    Q.rear->next=s;
    Q.rear = s;
}

template<typename ElemType>
bool DeQueue(LinkQueue<ElemType>&Q,ElemType&x){
    if (Q.front==Q.rear)
        return false;
    LinkNode<ElemType>*p=Q.front->next;
    x=p->data;
    Q.front->next=p->next;
    if (Q.rear==p)
        Q.rear=Q.front;
    delete p;
    return true;
}
相关推荐
mifengxing2 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
mifengxing3 小时前
LeetCode 189 轮转数组|3种解法拆解,从暴力到O(1)原地最优解
数据结构·算法·leetcode
MIngYaaa5203 小时前
2026暑期牛客多校3 2026-7-24
数据结构·算法·000
2501_937860944 小时前
Java 集合底层深度剖析:Map 与 Set、二叉搜索树、哈希表全解
java·数据结构·散列表
Hommy884 小时前
【剪映小助手】字符串列表转对象接口(Str List To Obds)
数据结构·list·剪映小助手·视频剪辑自动化·剪映api·开源剪映小助手
noipp5 小时前
推荐题目:洛谷 P3726 [AHOI2017/HNOI2017] 抛硬币
c语言·数据结构·c++·算法·编程·洛谷·luogu
Rabitebla5 小时前
C++ STL 之 set 详解:从底层红黑树到实际应用
开发语言·数据结构·c++·算法·leetcode
520拼好饭被践踏5 小时前
JAVA+Agent学习day26
java·开发语言·数据结构·学习·agent
郝学胜-神的一滴5 小时前
力扣 692:巧用小顶堆高效求解前K个高频单词
java·数据结构·python·程序人生·算法·leetcode·职场和发展
额,不知道写啥。6 小时前
题解:P16710 愿望
数据结构·算法