一、实现顺序栈的各种基本运算的算法
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct{
char data[MaxSize];
int top;
}SqStack;
//初始化栈
void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//销毁栈
void DestroyStack(SqStack *&s){
free(s);
}
//判断表空
bool StackEmpty(SqStack *s){
return(s->top==-1);
}
//进栈push
bool Push(SqStack *&s,char e){
if(s->top==MaxSize-1)return false;
s->top++;
s->data[s->top]=e;
return true;
}
//出栈Pop
bool Pop(SqStack *&s,char &e){
if(s->top==-1)return false;
e=s->data[s->top];
s->top--;
return true;
}
//得到栈顶元素
bool GetTop(SqStack *&s,char &e){
if(s->top==-1)return false;
e=s->data[s->top];
return true;
}
int main(){
SqStack *s;
char e;
//1初始化栈
InitStack(s);
printf("1、初始化栈:完成!\n");
//2判断栈是否为空
printf("2、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//3依次进栈元素a、b、c、d、e
printf("3、依次进栈元素a、b、c、d、e:");
char a[5]={'a','b','c','d','e'};
for(int i=0;i<5;i++){
Push(s,a[i]);
printf("%c\t",e);
}
printf("\n");
//4判断栈是否为空
printf("4、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//5输出出栈序列
printf("5、输出出栈序列:");
while(s->top!=-1){
Pop(s,e);
printf("%c\t",e);
}
printf("\n");
//6判断栈是否为空
printf("5、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//7释放栈
printf("7、释放栈:完成!");
DestroyStack(s);
return 0;
}
结果:
二、实现链栈的各种基本运算的算法
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct linknode{
char data;
struct linknode *next;
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s){
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next=NULL;
}
//销毁栈
void DestroyStack(LinkStNode *&s){
LinkStNode *pre=s,*p=s->next;
while(p!=NULL){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
//判断表空
bool StackEmpty(LinkStNode *s){
return(s->next==NULL);
}
//进栈push
void Push(LinkStNode *&s,char e){
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
//出栈Pop
bool Pop(LinkStNode *&s,char &e){
LinkStNode *p;
if(s->next==NULL) return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
//得到栈顶元素
bool GetTop(LinkStNode *&s,char &e){
if(s->next==NULL)return false;
e=s->next->data;
return true;
}
int main(){
LinkStNode *s;
char e;
//1初始化栈
InitStack(s);
printf("1、初始化栈:完成!\n");
//2判断栈是否为空
printf("2、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//3依次进栈元素a、b、c、d、e
printf("3、依次进栈元素a、b、c、d、e:");
char a[5]={'a','b','c','d','e'};
for(int i=0;i<5;i++){
Push(s,a[i]);
printf("%c\t",e);
}
printf("\n");
//4判断栈是否为空
printf("4、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//5输出出栈序列
printf("5、输出出栈序列:");
while(s->next!=NULL){
Pop(s,e);
printf("%c\t",e);
}
printf("\n");
//6判断栈是否为空
printf("5、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//7释放栈
printf("7、释放栈:完成!");
DestroyStack(s);
return 0;
}
结果:
三、实现环形队列的各种基本运算的算法
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct {
char data[MaxSize];
int front,rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue *&q){
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
//销毁队列
void DestroyQueue(SqQueue *&q){
free(q);
}
//判断队列空
bool QueueEmpty(SqQueue *q){
return(q->front==q->rear);
}
//进队列
bool enQueue(SqQueue *&q,char e){
if((q->rear+1)%MaxSize==q->front)return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
//出队列
bool deQueue(SqQueue *&q,char &e){
if(q->rear==q->front) return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}
int main(){
SqQueue *s;
char e;
//1初始化队列
InitQueue(s);
printf("1、初始化队列:完成!\n");
//2判断队列是否为空
printf("2、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//3依次进队列元素a、b、c、d、e
printf("3、依次进队列元素a、b、c、d、e:");
char a[5]={'a','b','c','d','e'};
for(int i=0;i<5;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//4判断队列是否为空
printf("4、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//5输出出队列序列
printf("5、输出出队列序列:");
while(s->rear!=s->front){
deQueue(s,e);
printf("%c\t",e);
}
printf("\n");
//6判断栈是否为空
printf("5、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//7释放栈
printf("7、释放队列:完成!");
DestroyQueue(s);
return 0;
}
截图:
四、实现链队的各种基本运算的算法
#include<stdio.h>
#include<stdlib.h>
typedef struct qnode{
char data;
struct qnode *next;
}DataNode;
typedef struct {
DataNode *front;
DataNode *rear;
}LinkQuNode;
//初始化队列
void InitQueue(LinkQuNode *&q){
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
//销毁队列
void DestroyQueue(LinkQuNode *&q){
DataNode *pre=q->front,*p;
if(pre!=NULL){
p=pre->next;
while(p!=NULL){
free(pre);
pre==p;
p=p->next;
}
free(pre);
}
free(q);
}
//判断队列空
bool QueueEmpty(LinkQuNode *q){
return(q->rear==NULL);
}
//进队列
void enQueue(LinkQuNode *&q,char e){
DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode));
p->data=e;
p->next=NULL;
if(q->rear==NULL) q->front=q->rear=p;
else{
q->rear->next=p;
q->rear=p;
}
}
//出队列
bool deQueue(LinkQuNode *&q,char &e){
DataNode *t;
if(q->rear==NULL)return false;
t=q->front;
if(q->rear==q->front) q->front=q->rear=NULL;
else q->front=q->front->next;
e=t->data;
free(t);
return true;
}
int main(){
LinkQuNode *s;
char e;
//1初始化队列
InitQueue(s);
printf("1、初始化队列:完成!\n");
//2判断队列是否为空
printf("2、判断队列是否为空:");
QueueEmpty(s);
if(QueueEmpty(s))printf("队列为空!\n");
else printf("队列非空!\n");
//3依次进队列元素a、b、c、d、e
printf("3、依次进队列元素a、b、c、d、e:");
char a[6]={'a','b','c','d','e','f'};
for(int i=0;i<3;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//4出队一个元素,并输出
printf("4、出队一个元素,该元素为:");
deQueue(s,e);
printf("%c\n",e);
//5依次进队列元素d、e、f
printf("5、依次进队列元素d、e、f:");
for(int i=3;i<6;i++){
enQueue(s,a[i]);
printf("%c\t",a[i]);
}
printf("\n");
//6输出出队列序列
printf("5、输出出队列序列:");
while(s->front!=NULL){
deQueue(s,e);
printf("%c\t",e);
}
printf("\n");
//7释放栈
printf("7、释放队列:完成!");
DestroyQueue(s);
return 0;
}
截图:
(如有不懂欢迎大家一起讨论【所有不会的数据结构皆可免费咨询】)