数据结构笔记(二) 栈和队列(C语言描述)

数据结构(二) 栈和队列

顺序栈

存储结构
#define MAXSIZE 50
#define SElemType int
typedef struct{
    SElemType *top;
    SElemType *base;
    int stacksize;
}SqStack;
初始化
bool initStack(SqStack &S){
    S.base = new SElemType[MAXSIZE];
    if(!S.base){
        cout << "内存分配失败" << endl;
        return false;
    }
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return true;
}
入栈
bool Push(SqStack &S, SElemType e){
    if(S.top - S.base == S.stacksize){
        cout << "栈满,入栈失败" << endl;
        return false;
    }
    *S.top++ = e;
    return true;
}
出栈
bool Pop(SqStack &S, SElemType &e){
    if(S.top == S.base){
        cout << "栈空,出栈失败" << endl;
        return false;
    }
    e = *--S.top;
    return true;
}
获取栈顶元素
SElemType getElem(SqStack S){
    if(S.base != S.top) return *(S.top - 1);
}

链栈

存储结构
#define ElemType int
typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode, *LinkStack;
初始化
void InitStack(LinkStack &S){
    S = NULL;
}
入栈
void Push(LinkStack &S, ElemType e){
    StackNode *p = new StackNode;
    p->data = e;
    p->next = S;
    S = p;
}
出栈
bool Pop(LinkStack &S, ElemType &e){
    if(S == NULL) return false;
    e = S->data;
    StackNode *p = S;
    S = S->next;
    delete p;
    return true;
}
获取栈顶元素
ElemType getTop(LinkStack S){
    if(S != NULL){
        return S->data;
    }
}

队列

循环队列

存储结构
#define MAXSIZE 100
#define ElemType int
typedef struct{
    ElemType *base;//存储空间的基地址
    int front;//头指针
    int rear;//尾指针
}SqQueue;
初始化
bool InitQueue(SqQueue &Q){
    Q.base = new ElemType[MAXSIZE];
    if(!Q.base){
        cout << "初始化失败" << endl;
        return false;
    }
    Q.front = Q.rear = 0;
    return true;
}
获取队列长
int getLength(SqQueue Q){
    return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
入队
bool EnQueue(SqQueue &Q, ElemType e){
    if((Q.rear + 1) % MAXSIZE == Q.front){
        cout << "队满" << endl;
        return false;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXSIZE;
    return true;
}
出队
bool DeQueue(SqQueue &Q, ElemType &e){
    if(Q.front == Q.rear){
        cout << "队空" << endl;
        return false;
    }
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXSIZE;
    return true;
}
获取队头元素
ElemType getElem(SqQueue Q){
    if(Q.front != Q.rear){
        return Q.base[Q.front];
    }
}

链队

存储结构
#define ElemType int
typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
初始化
void InitQueue(LinkQueue &Q){
    Q.front = Q.rear = new QNode;
    Q.front->next = NULL;
}
入队
void EnQueue(LinkQueue &Q, ElemType e){
    QNode *p = new QNode;//创建新节点
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;//连接新节点
    Q.rear = p;//尾指针后移
}
出队
bool DeQueue(LinkQueue &Q, ElemType &e){
    if(Q.front == Q.rear) return false;
    QNode *p = Q.front->next;//保存节点
    e = p->data;//将节点数据保存
    Q.front->next = p->next;//指针后移
    if(Q.rear == p) Q.rear = Q.front;//如果到队尾,更新
    delete p; //删除节点
    return true;
}
获取队头元素
ElemType getElem(LinkQueue Q){
    if(Q.front != Q.rear) return Q.front->next->data;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值