一,顺序栈
顺序栈的定义:
1 2 3 4 5
| #define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int top; }SqStack;
|
顺序栈的初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int top; }SqStack;
void InitStack(SqStack &S){ S.top = -1; }
bool StackEmpty(SqStack S){ if(S.top == -1) return true; else return false; }
|
入栈出栈:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| bool Push(SqStack &S, ElemType x){ if(S.top == MaxSize - 1) return false; S.data[++S.top] = x; return true; }
bool Pop(SqStack &x, ElemType &x){ if(S.top == -1) return false; x = S.data[S.top--]; return true; }
|
读取栈顶元素:
1 2 3 4 5 6 7
| bool GetTop(SqStack S, ElemType &x){ if(S.top == -1) return false; x = S.data[S.top]; return true; }
|
共享栈(两个栈共享同一片空间):
1 2 3 4 5 6 7 8 9 10 11 12
| #define MaxSize 10 typedef struct{ ElemType data[MaxSize]; int top0; int top1; }ShStack;
void InitSqStack(ShStack &S){ S.top0 = -1; S.top1 = MaxSize; }
|
二,链栈
链栈的定义:
1 2 3 4 5 6 7 8
| typedef struct Linknode{ ElemType data; Linknode *next; }Linknode,*LiStack;
void testStack(){ LiStack L; }
|
链栈的初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| typedef struct Linknode{ ElemType data; Linknode *next; }Linknode,*LiStack;
bool InitStack(LiStack &L){ L = (Linknode *)malloc(sizeof(Linknode)); if(L == NULL) return false; L->next = NULL; return true; }
bool isEmpty(LiStack &L){ if(L->next == NULL) return true; else return false; }
|
入栈出栈:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| bool pushStack(LiStack &L,ElemType x){ Linknode *s = (Linknode *)malloc(sizeof(Linknode)); if(s == NULL) return false; s->data = x; s->next = L->next; L->next = s; return true; }
bool popStack(LiStack &L, int &x){ if(L->next == NULL) return false; Linknode *s = L->next; x = s->data; L->next = s->next; free(s); return true; }
|
三,顺序队列
顺序队列的定义:
1 2 3 4 5 6 7 8 9
| #define MaxSize 10; typedef struct{ ElemType data[MaxSize]; int front, rear; }SqQueue;
void test{ SqQueue Q; }
|
顺序队列的初始化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #define MaxSize 10; typedef struct{ ElemType data[MaxSize]; int front, rear; }SqQueue;
void InitQueue(SqQueue &Q){ Q.rear = Q.front = 0; }
bool QueueEmpty(SqQueue Q){ if(Q.rear == Q.front) return true; else return false; }
|
入队出队(循环队列):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| bool EnQueue(SqQueue &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; }
bool DeQueue(SqQueue &Q, ElemType &x){ if(Q.rear == Q.front) return false; x = Q.data[Q.front]; Q.front = (Q.front+1)%MaxSize; return true; }
|
获得队头元素:
1 2 3 4 5 6 7
| bool GetHead(SqQueue &Q, ElemType &x){ if(Q.rear == Q.front) return false; x = Q.data[Q.front]; return true; }
|
四,链队列
链队列的定义:
1 2 3 4 5 6 7 8 9 10 11
| typedef struct LinkNode{ ElemType data; struct LinkNode *next; }
typedef struct{ LinkNode *front, *rear; }LinkQueue;
|
链队列的初始化(带头结点):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode;
typedef struct{ LinkNode *front, *rear; }LinkQueue;
void InitQueue(LinkQueue &Q){ Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode)); Q.front -> next = NULL; }
bool IsEmpty(LinkQueue Q){ if(Q.front == Q.rear) return true; else return false; }
|
入队出队:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void EnQueue(LinkQueue &Q, ElemType x){ LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = x; s->next = NULL; Q.rear->next = s; Q.rear = s; }
bool DeQueue(LinkQueue &Q, ElemType &x){ if(Q.front == Q.rear) return false; LinkNode *p = Q.front->next; x = p->data; Q.front->next = p->next; if(Q.rear == p) Q.rear = Q.front; free(p); return true; }
|
以上是带头结点的链队列,下面是不带头结点的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode;
typedef struct{ LinkNode *front, *rear; }LinkQueue;
void InitQueue(LinkQueue &Q){ Q.front = NULL; Q.rear = NULL; }
bool IsEmpty(LinkQueue Q){ if(Q.front == NULL) return true; else return false; }
void EnQueue(LinkQueue &Q, ElemType x){ LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = x; s->next = NULL; if(Q.front == NULL){ Q.front = s; Q.rear = s; }else{ Q.rear->next = s; Q.rear = s; } }
bool DeQueue(LinkQueue &Q, ElemType &x){ if(Q.front == NULL) return false; LinkNode *s = Q.front; x = s->data; if(Q.front == Q.rear){ Q.front = Q.rear = NULL; }else{ Q.front = Q.front->next; } free(s); return true; }
|
参考自:https://blog.csdn.net/qq_55593227/article/details/123598044