1.顺序栈
#pragma once
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define MAXSIZE 100
typedef int Status;
typedef char SElemType;
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
//顺序栈初始化
Status InitStack(SqStack& S)
{
S.base = new SElemType[MAXSIZE];
if (!S.base)exit(OVERFLOW);
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
Status StackEmpty(SqStack& S)
{
if (S.base == S.top)return TRUE;
else return FALSE;
}
Status StackLength(SqStack& S)
{
return S.top - S.base;
}
Status ClearStack(SqStack& S)
{
if (S.base)
{
S.top = S.base;
}
return OK;
}
Status DestroyStack(SqStack& S)
{
if (S.base)
{
delete[]S.base;
S.stacksize = 0;
S.top = S.base = nullptr;
}
return OK;
}
Status Push(SqStack& S, SElemType e)
{
if ((S.top - S.base) == S.stacksize)
{
return ERROR;
}
*S.top++ = e;
return OK;
}
Status Pop(SqStack& S, SElemType& e)
{
if (S.top == S.base)return ERROR;
--S.top;
e = *S.top;
return OK;
}
2.链式栈
#pragma once
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define MAXSIZE 100
typedef int Status;
typedef char SElemType;
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode,*LinkStack;
void InitStack(LinkStack& S)
{
S = nullptr;//没有设置头结点
}
Status StackEmpty(LinkStack& S)
{
if (!S)return TRUE;
else return FALSE;
}
Status Push(LinkStack& S, SElemType e)
{
auto p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
Status Pop(LinkStack& S, SElemType& e)
{
if (!S)return ERROR;
e = S->data;
auto p = S;
S = S->next;
delete p;
return OK;
}
SElemType GetTop(LinkStack& S)
{
if (S) {
return S->data;
}
}
3.顺序队列
#pragma once
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define MAXSIZE 100
typedef int Status;
typedef char QElemType;
typedef struct
{
QElemType* base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue& Q)
{
Q.base = new QElemType[MAXSIZE];
if (Q.base)exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
int QueueLength(SqQueue& Q)
{
return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);
}
//入队
Status QueueEn(SqQueue& Q, QElemType e)
{
if ((Q.rear + 1) % MAXSIZE == Q.front)return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return OK;
}
//出队
Status DeQueue(SqQueue& Q, QElemType& e)
{
if (Q.front == Q.rear)return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE;
return OK;
}
QElemType GetFront(SqQueue& Q)
{
if (Q.front != Q.rear)
{
return Q.base[Q.front];
}
}
4.链式队列
#pragma once
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define MAXSIZE 100
typedef int Status;
typedef char QElemType;
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = new QNode;
if (!Q.front)exit(OVERFLOW);
Q.front->next = nullptr;
Q.rear->next = nullptr;
return OK;
}
Status DestroyQueue(LinkQueue& Q)
{
while (Q.front)
{
auto p = Q.front->next;
delete Q.front;
Q.front = p;
}
return OK;
}
Status QueueEn(LinkQueue& Q, QElemType e)
{
auto p = new QNode;
if (!p)exit(OVERFLOW);
p->data = e;
p->next = nullptr;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue& Q, QElemType& e)
{
if (Q.front == Q.rear)return ERROR;
auto p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (p == Q.rear)Q.rear = Q.front;
delete p;
return OK;
}