数据结构与算法(二)栈和队列
- 栈的顺序实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Arr
{
int* pBase;
int len;//数组长度
int top;//栈顶指针
}Arr;
void init_arr(Arr*, int);
bool push(Arr*, int);
bool insert_arr(Arr*, int, int);
bool pop(Arr*,int*);
bool is_empty(Arr*);
bool is_full(Arr* pArr);
void sort_arr(Arr*);
void show_arr(Arr*);
void inversion_arr(Arr*);
int main()
{
int val0;
int val1;
struct Arr arr;
init_arr(&arr, 6);
push(&arr, 1);
push(&arr, 2);
push(&arr, 3);
show_arr(&arr);
pop(&arr, &val0);
pop(&arr, &val1);
printf("弹出的数字是:%d\n",val0);
printf("弹出的数字是:%d\n",val1);
show_arr(&arr);
free((&arr)->pBase);
return 0;
}
void init_arr(Arr* pArr, int length)
{
pArr->pBase = (int*)malloc(sizeof(int) * length);
if (pArr->pBase == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
else
{
pArr->top = 0;
pArr->len = length;
}
}
bool push(Arr* pArr, int val)
{
if (is_full(pArr))
return false;
else
{
pArr->pBase[pArr->top] = val;
(pArr->top++);
return true;
}
}
void show_arr(Arr* pArr)
{
if (is_empty(pArr))
{
printf("数组为空\n");
}
else
{
for (int i = pArr->top - 1; i >= 0; --i)
{
printf("%d\n", pArr->pBase[i]);
}
}
}
bool is_empty(Arr* pArr)
{
if (pArr->top == NULL)
return true;
else
return false;
}
bool is_full(Arr* pArr)
{
if (pArr->top == pArr->len)
return true;
else
return false;
}
bool pop(Arr* pArr, int* pVal)
{
if (is_empty(pArr))
return false;
else
{
*pVal = pArr->pBase[pArr->top-1];
pArr->top--;
}
return true;
}
- 两栈共享空间
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#define MAX 20
typedef struct
{
int data[MAX];
int top1;
int top2;
}SqDuStack;
int visit(int c)
{
printf("%d ",c);
return 1;
}
int initStack(SqDuStack* S)
{
S->top1 = -1;
S->top2 = MAX;
return 1;
}
int ClearStack(SqDuStack* S)
{
S->top1 = -1;
S->top2 = MAX;
return 1;
}
int StackEmpty(SqDuStack* S)
{
if (S->top1 == -1 && S->top2 == MAX)
return 1;
else
return 0;
}
int StackLength(SqDuStack* S)
{
return (S->top1 + 1) + (MAX - S->top2);
}
int push(SqDuStack* S, int e, int stackNumber)
{
if (S->top1 + 1 == S->top2)
return 0;
if (stackNumber == 1)
S->data[++S->top1] = e;
else if (stackNumber == 2)
S->data[--S->top2] = e;
return 1;
}
int pop(SqDuStack* S, int* e, int stackNumber)
{
if (stackNumber == 1)
{
if (S->top1 == -1)
return 0;
*e = S->data[S->top1--];
}
else if(stackNumber == 2)
{
if (S->top2 == MAX)
return 0;
*e = S->data[S->top2++];
}
return 1;
}
int StackTraverse(SqDuStack* S)
{
int i = 0;
while (i <= S->top1)
{
visit(S->data[i++]);
}
i = S->top2;
while (i < MAX)
{
visit(S->data[i++]);
}
printf("\n");
return 1;
}
int main()
{
int j;
SqDuStack s;
int e;
if (initStack(&s) == 1)
{
for (j = 1; j <= 5; j++)
push(&s, j, 1);
for (j = MAX; j >= MAX - 2; j--)
push(&s,j,2);
}
printf("栈中的元素为:");
StackTraverse(&s);
printf("当前栈中元素有:%d\n",StackLength(&s));
pop(&s,&e,2);
printf("弹出的栈顶元素为e=%d\n",e);
printf("栈是否为空:%d(1空,0非空)\n",StackEmpty(&s));
for (j = 6; j < MAX - 2; j++)
push(&s,j,1);
printf("栈中元素依次为:");
StackTraverse(&s);
printf("栈满否:%d(1空,0非空)\n", push(&s,100,1));
ClearStack(&s);
printf("清空后,栈空否:%d(1空,0非空)\n", StackEmpty(&s));
return 0;
}
- 栈的链式实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node* next;
}NODE,*PNODE;
typedef struct linklist
{
PNODE top;//栈顶指针
int count;//计数
}LinkStack;
void init_Stack(LinkStack* pS)
{
pS->count = 0;
pS->top = NULL;
}
bool push(LinkStack* pS, int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
pNew->data = val;
pNew->next = pS->top;
pS->top = pNew;
pS->count++;
return true;
}
bool pop(LinkStack* pS, int* pVal)
{
PNODE p;
if (pS->top == NULL)
return false;
else
{
*pVal = pS->top->data;
p = pS->top;
pS->top = p->next;
free(p);
pS->count--;
return true;
}
}
void show(LinkStack* pS)
{
int i = 0;
PNODE q = pS->top;
if (pS->count == 0)
printf("栈为空\n");
else
{
for (i = 0; i < pS->count; ++i)
{
printf("%d\t",q->data);
q = q->next;
}
printf("\n");
}
}
int main()
{
int val;
LinkStack S;
init_Stack(&S);
push(&S,1);
push(&S,2);
push(&S,3);
push(&S,4);
show(&S);
pop(&S,&val);
printf("弹出的数字为:%d\n",val);
show(&S);
return 0;
}
- 栈与递归
#include <stdio.h>
int move(int n, char X, char Y)
{
printf("将%c的%d块:%c-->%c\n",X,n,X,Y);
return 0;
}
void hanoi(int n, char X, char Y, char Z)
{
if (n == 1)
{
move(n,X,Z);
}
else
{
hanoi(n-1,X,Z,Y);
move(n,X,Z);
hanoi(n - 1, Y, X, Z);
}
}
int main()
{
int n;
printf("几个:\t");
scanf_s("%d",&n);
hanoi(n,'A','B','C');
}
- 队列的顺序实现
/*顺序栈由于空间有限所以一般使用循环队列*/
#include <stdio.h>
#include <malloc.h>
#define MAX 10
typedef struct
{
int data[MAX];
int rear, front;
}SeQueue;
void init_Queue(SeQueue* Sq)
{
Sq->front = -1;
Sq->rear=Sq->front;
}
bool is_full(SeQueue* Sq)
{
if ((Sq->rear + 1) % MAX == Sq->front)
return true;
else
return false;
}
bool In_Queue(SeQueue* Sq,int val)
{
if (is_full(Sq))
return false;
else
{
Sq->rear=(Sq->rear+1)%MAX;
Sq->data[Sq->rear] = val;
}
return true;
}
bool Out_Queue(SeQueue* Sq, int* pVal)
{
Sq->front=(Sq->front+1)%MAX;
*pVal = Sq->data[Sq->front];
Sq->data[Sq->front] = NULL;
return true;
}
void show(SeQueue* Sq)
{
int i = 0;
for (i = 0; i < MAX; i++)
{
printf("%d\t",Sq->data[i]);
}
printf("\n");
}
int main()
{
int val;
SeQueue q;
init_Queue(&q);
In_Queue(&q, 1);
In_Queue(&q, 2);
In_Queue(&q, 3);
In_Queue(&q, 4);
In_Queue(&q, 5);
In_Queue(&q, 6);
In_Queue(&q, 7);
In_Queue(&q, 8);
In_Queue(&q, 9);
In_Queue(&q, 10);
In_Queue(&q, 11);
show(&q);
Out_Queue(&q,&val);
printf("出队的数字是%d\n",val);
show(&q);
return 0;
}
- 队列的链式实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node* next;
}NODE,*PNODE;
typedef struct
{
PNODE front;
PNODE rear;
}LinkQueue;
void init_Queue(LinkQueue* Sq)
{
Sq->front = (PNODE)malloc(sizeof(NODE));
if (Sq->front == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
else
{
Sq->rear = Sq->front;
Sq->front->next = NULL;
}
}
bool is_empty(LinkQueue* Sq)
{
if (Sq->front == Sq->rear)
return true;
else
return false;
}
bool In_Queue(LinkQueue* Sq,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
else
{
pNew->data = val;
pNew->next = NULL;
Sq->rear->next = pNew;
Sq->rear = pNew;
return true;
}
}
bool Out_Queue(LinkQueue* Sq, int* pVal)
{
if (is_empty(Sq))
return false;
else
{
PNODE q = Sq->front->next;
*pVal = q->data;
Sq->front->next = q->next;
free(q);
q = NULL;
if (Sq->front->next == NULL)
{
Sq->rear = Sq->front;
}
return true;
}
}
void show(LinkQueue* Sq)
{
PNODE q = Sq->front;
while (q != Sq->rear)
{
printf("%d\t",q->next->data);
q = q->next;
}
printf("\n");
}
int main()
{
int val;
LinkQueue q;
init_Queue(&q);
In_Queue(&q, 1);
In_Queue(&q, 2);
In_Queue(&q, 3);
In_Queue(&q, 4);
show(&q);
Out_Queue(&q, &val);
printf("出队的数字是%d\n", val);
show(&q);
return 0;
}
如有问题请多指教