栈和队列的操作(c)

全部在VC6.0++下实现

//顺序栈
#include
    
    
     
     
#include
     
     
      
      

#define MAXSIZE 10
typedef int datatype;
typedef struct{
	datatype data[MAXSIZE];
	int top;                //栈顶指针
}SeqStack;

//置空栈:首先建立栈空间,然后初始化栈顶指针
SeqStack* Init_SeqStack(){
	SeqStack *s;
	s=(SeqStack *)malloc(sizeof(SeqStack));
	if(s==NULL){
		printf("申请内存失败!\n");
		return NULL;
	}
	else{
		s->top=-1; //置空栈操作,栈顶指针始终指向当前栈顶元素的位置
		return s;
	}
}

//判空栈
int Empty_SeqStack(SeqStack *s){
	if(s->top== -1) //空栈标志
		return 1;
	else
		return 0;
}

//入栈
int Push_SeqStack(SeqStack *s,datatype x){
	if(s->top==MAXSIZE-1){
		printf("栈满不能入栈\n");
		return 0;      //栈满不能入栈
	}
	else{
		s->top++;
		s->data[s->top]=x;
		return 1;
	}
}

//出栈
int Pop_SeqStack(SeqStack *s,datatype *x){
	if(Empty_SeqStack(s)){
        printf("栈为空不能出栈\n");
		return 0;        //栈空不能出栈
	}
	else{
		*x=s->data[s->top]; //取栈顶值,栈顶指针始终指向当前栈顶元素的位置
		s->top--;
		return 1;
	}
}

//取栈顶元素
int Top_SeqStack(SeqStack *s,datatype *x){
	if(Empty_SeqStack(s)){//栈空
		printf("栈为空,不能取!\n");
		return 0;
	}
	else{
		*x=s->data[s->top]; //只读取栈顶元素的值,栈顶指针指针top位置保持不变
		return 1;
	}
}

//测试
int main(void){
	int i;
	int a;
	SeqStack *s;
	s=Init_SeqStack();//创建栈
	if(s==NULL)
		return 0;
	i=0;
	while(i<=MAXSIZE){
		printf("请输入元素值(整形):");
		scanf("%d",&a);
        Push_SeqStack(s,a);
		i++;
	}
    Pop_SeqStack(s,&a);
	printf("出栈顶元素为%d\n",a);
    Top_SeqStack(s,&a);
    printf("取栈顶元素为%d\n",a);
	return 1;
}


//链栈
#include
      
      
       
       
#include
       
       
        
        
#define FALSE 0;
#define TRUE  1;

typedef int Elemtype;
typedef struct Stacknode{
	Elemtype data;
	struct Stacknode *next;
}slStacktype;

//初始化操作
slStacktype * init_Lstack(){           //创建带有头结点的链栈
	slStacktype *p;
	p=(slStacktype *)malloc(sizeof(slStacktype));
	if(p==NULL)
		printf("申请内存失败,初始化失败!\n");
	else
		p->next=NULL;
	return p;
}

//入栈操作
int push_Lstack(slStacktype *top,Elemtype x){ 
	slStacktype *p;
	p=(slStacktype*)malloc(sizeof(slStacktype));
	if(p==NULL){
		printf("申请内存失败,入栈失败!\n");
		return FALSE;
	}
	p->data=x;                 //根据栈的特点采用头插法
	p->next=top->next;
	top->next=p;
	return TRUE;
}

//出栈
int pop_Lstack(slStacktype *top,Elemtype * x){
	slStacktype *p;
	if(top->next==NULL){         //判空栈
		printf("栈为空,出栈失败!\n");
		return FALSE;
	}
	p=top->next;               //出栈
	top->next=p->next;
	*x=p->data;
	free(p);                  //释放资源
	return TRUE;
}

//打印栈中的数据
void print_Lstack(slStacktype *top){
	slStacktype *p;
	p=top->next;
	while(p!=NULL){
		printf("%d\n",p->data);
		p=p->next;
	}
}

//测试
int main(void){
	int a;
	slStacktype *top;
	top=init_Lstack();
	if(top!=NULL){
		printf("请输入,入栈值(-1结束):");
		scanf("%d",&a);
		while(a!=-1){
           push_Lstack(top,a);
           printf("请输入,入栈值(-1结束):");
	       scanf("%d",&a);
		}
        pop_Lstack(top,&a);
		printf("出栈值为%d\n",a);
		printf("打印栈中的元素:\n");
		print_Lstack(top);
	}
}
//两栈的共享,共享一维数组
#include
        
        
          #include 
         
           #define MAXNUM 10 #define FALSE 0 #define TRUE 1 typedef int Elemtype; typedef struct{ Elemtype stack[MAXNUM]; //左右栈共享的数据区 int lefttop; //左栈栈顶指针 int righttop; //右栈栈顶指针 }dupsqstack; /* 为了识别左右栈,设置两个标志 char status; status='L'; //左栈 status='R'; //右栈 */ //初始化操作 int init_DupStack(dupsqstack *s){ /* if((s=(dupsqstack *)malloc(sizeof(dupsqstack)))==NULL){ printf("申请内存失败!\n"); return FALSE; } */ s->lefttop=-1; //左栈空时,标志 s->righttop=MAXNUM; //右栈空时,标志 return TRUE; } //入栈操作 int push_DupStack(dupsqstack *s,char status,Elemtype x){ if(s->lefttop+1==s->righttop){ //栈满标志 printf("栈满不能入栈!\n"); return FALSE; } if(status=='L'){ s->lefttop++; s->stack[s->lefttop]=x; //++左栈进栈 } else if(status=='R'){ s->righttop--; s->stack[s->righttop]=x; //--右栈进栈 } else{ printf("输入符号有误,入栈失败!\n"); return FALSE; } return TRUE; } //出栈操作 int pop_DupStack(dupsqstack *s,char status,Elemtype *x){ //先判断栈是出那个栈元素,再进行出栈操作 if(status=='L'){ //左栈 if(s->lefttop<0){ printf("左栈为空,出栈失败!\n"); return FALSE; } else{ *x=s->stack[s->lefttop]; //取栈顶元素 s->lefttop--; //改变栈顶指针-- return TRUE; } } else if(status=='R'){ //右栈 if(s->righttop>MAXNUM-1){ printf("右栈为空,出栈失败!\n"); return FALSE; } else{ *x=s->stack[s->righttop]; //取栈顶元素 s->righttop++; //改变栈顶指针++ return TRUE; } } else{ printf("选择栈有问题,出栈失败!"); return FALSE; } } //测试 int main(void){ int i; dupsqstack s; char st; int x; init_DupStack(&s); i=0; while(i<=MAXNUM){ printf("请选择栈(R或L):"); scanf("%c",&st); printf("请输入入栈值:"); scanf("%d",&x); fflush(stdin); //清除标准输入设备(即键盘)的缓冲区。 push_DupStack(&s,st, x); i++; } printf("出栈,请选择栈(R或L):"); scanf("%c",&st); pop_DupStack(&s,st,&x); printf("出栈值为%d\n",x); fflush(stdin); printf("出栈,请选择栈(R或L):"); scanf("%c",&st); pop_DupStack(&s,st,&x); printf("出栈值为%d\n",x); } //用数组保存所有链栈的栈顶指针,访问链栈时要提供对应链栈的下标 #define FALSE 0; #define TRUE 1; #define M 10; typedef int Elemtype; typedef struct Stacknode{ Elemtype data; struct Stacknode *next; }slStacktype; //将栈顶指针放在一个一维数组中,统一管理 //slStacktype *top[M]; //入栈操作 int push_Lstack(slStacktype *top[],int i,Elemtype x){ //将元素x压入链栈top[i]中 slStacktype *p; p=(slStacktype*)malloc(sizeof(slStacktype)); if(p==NULL){ printf("申请内存失败,入栈失败!\n"); return FALSE; } p->data=x; //根据栈的特点采用头插法 p->next=top[i]->next; top[i]->next=p; return TRUE; } //出栈 int pop_Lstack(slStacktype *top[],int i,Elemtype * x){ //从链栈top[i]中删除栈顶元素 slStacktype *p; if(top[i]->next==NULL){ //判空栈 printf("栈为空,出栈失败!\n"); return FALSE; } p=top[i]->next; //出栈 top[i]->next=p->next; *x=p->data; free(p); //释放资源 return TRUE; } 
          
        
       
       
      
      
     
     
    
    
//顺序队列
#include
   
   
    
    
#include
    
    
     
     

#define MAXSIZE 10

typedef int datatype;
typedef struct{
	datatype data[MAXSIZE];
	int front; //队头指示器,总是指向队头元素的前一个位置
	int rear; //队尾指示器,总是指向队尾元素
}SeQueue;

//初始化队列
SeQueue* Init_Queue(){
	SeQueue *p;
	p=(SeQueue*)malloc(sizeof(SeQueue));
	if(p==NULL)
		printf("初始化失败!\n");
	else{
		p->front=-1;  //初始化
		p->rear=-1;
	}
	return p;
}
//不考虑溢出情况下入队
void In_Queue(SeQueue *p,datatype x){
	p->rear++;
	p->data[p->rear]=x;
}
//不考虑空队情况下出队
void  Out_Queue(SeQueue *p,datatype *x){
	p->front++;
	*x=p->data[p->front];
}
//循环队列---规定顺序队列最后一个单元的后继为第一个单元
#include
     
     
      
      
#include
      
      
       
       

#define MAXSIZE 10       //循环队列中最多存储MAXSIZE-1个元素
#define FALSE  0
#define TRUE  1
typedef int datatype;
typedef struct{
	datatype data[MAXSIZE];
	int front; //队头指示器,总是指向队头元素的前一个位置
	int rear; //队尾指示器,总是指向队尾元素
}CSeQueue;

//置空队
CSeQueue* Init_SeQueue(){
	CSeQueue *p;
	p=(CSeQueue *)malloc(sizeof(CSeQueue));
	if(p==NULL)
		printf("置空队失败!!!\n");
	else{
		p->front=MAXSIZE-1;      //置空队条件
	    p->rear=MAXSIZE-1;
	}
	return p;
}

//入队
int In_SeQueue(CSeQueue *q,datatype x){
	if((q->rear+1)%MAXSIZE==q->front){   //队满条件
		printf("队满,不能入队\n");
		return FALSE;
	}
	else{
		q->rear=(q->rear+1)%MAXSIZE;            //入对条件
		q->data[q->rear]=x;
		return TRUE;
	}
}

//出队
int Out_SeQueue(CSeQueue *q,datatype *x){
	if(q->front==q->rear){   //空队条件
		printf("队空,不能出队!\n");
		return FALSE;
	}
	else{
		q->front=(q->front+1)%MAXSIZE;  //出队条件
		*x=q->data[q->front];           //读出队头元素
		return TRUE; 
	}
}

//判队空
int Empty_SeQueue(CSeQueue *q){
	if(q->front==q->rear)
		return TRUE;
	else
		return FALSE;
}

// 读队头元素
int Front_SeQueue(CSeQueue *p,datatype *x){
	int k;
	if(Empty_SeQueue(p)){
		printf("队空\n");
		return FALSE;
	}
	else{
        k=p->front;
		k=(k+1)%MAXSIZE;
		*x=p->data[k];
		return TRUE;
	}
}

//测试
int main(void){
	int i;
	int x;
	CSeQueue *q;
	q=Init_SeQueue();
	if(q==NULL)
		return 0;
	else{
		printf("判断队是否为空1:%d\n",Empty_SeQueue(q));
		i=0;
		while(i
       
       
         #include 
        
          #define TRUE 1 #define FALSE 0 typedef int datatype; //链队列的数据类型描述 typedef struct node{ datatype data; struct node *next; }QNode; //链队列结点的描述 typedef struct { QNode *front; //队头指针 QNode *rear; //队尾指针 }LQueue; //创建一个带头结点的空队 LQueue * Init_LQueue(){ LQueue *q; QNode *p; q=(LQueue *)malloc(sizeof(LQueue));//申请头尾指针结点 p=(QNode *)malloc(sizeof(QNode)); //申请链队头结点 if(p==NULL || q==NULL) printf("创建失败!!\n"); else{ p->next=NULL; q->front=q->rear=p; //置空队,指向头结点 } return q; } //入队 int IN_LQueue(LQueue *q,datatype x){ QNode *p; p=(QNode *)malloc(sizeof(QNode)); if(p==NULL){ printf("入队申请内存失败!\n"); return FALSE; } else{ p->data=x; p->next=NULL; //因为在队尾所以置为NULL q->rear->next=p; //将p链接到队尾 q->rear=p; //改变队尾指针 return TRUE; } } //判队空 int Empty_LQueue(LQueue *q){ if(q->front==q->rear) //空队条件 return TRUE; else return FALSE; } //出队 int Out_LQueue(LQueue *q,datatype *x){ QNode *p; if(Empty_LQueue(q)){ printf("空队!!\n"); return FALSE; } else{ p=q->front->next; //带头结点的队 q->front->next=p->next; *x=p->data; free(p); if(q->front->next==NULL) //只有一个元素时,出队后为空,修改队尾指针 q->rear=q->front; return TRUE; } } //打印队列中的元素 int print_LQueue(LQueue *q){ QNode *p; if(Empty_LQueue(q)){ printf("空队!!\n"); return FALSE; } else{ p=q->front->next; while(p!=NULL){ printf("%d\n",p->data); p=p->next; } return TRUE; } } //测试 int main(void){ int x; LQueue *q; q=Init_LQueue(); if(q==NULL) return 0; else{ printf("判断队是否为空%d\n",Empty_LQueue(q)); printf("请输入入队值(整形-1结束):"); scanf("%d",&x); while(x!=-1){ IN_LQueue(q, x); printf("请输入入队值(整形-1结束):"); scanf("%d",&x); } printf("判断队是否为空%d\n",Empty_LQueue(q)); Out_LQueue(q,&x); printf("出队元素%d\n",x); print_LQueue(q); return 1; } } 
         
       
      
      
     
     
    
    
   
   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值