数据结构6————队栈的应用1

数据结构6————队栈的应用1

一.前言

  • 关于队和栈的概念,可以看我的前两篇博客,在这里我就不贴队和栈的源代码,都是关于核心函数的代码。如果需要看完整代码,或者是运行查看结果,可以参看末尾的git链接,里面有源码。
  • 这一篇里的应用都是很简单的应用,其实不需要队和栈都可以实现,为了练手我就用队和栈实现了一次(其实是作业…)。
  • 关于堆和栈的更高级的应用(迷宫,马踏棋盘,中缀转后缀,后缀表达式的计算)可以参看我后续的博客。
  • 本文所介绍的应用
    • 括号匹配
    • 判断回文数
    • 进制转换
    • 杨辉三角

二.括号匹配

1.问题描述

假设在表达式中
([]())或[([ ][ ])]等为正确的格式,
[( ])或([( ))或 (()])均为不正确的格式。

2.思路
  • 凡出现左括弧,则进栈;
  • 凡出现右括弧,首先检查栈是否空
    • 若栈空,则表明该“右括弧”多余,
    • 否则和栈顶元素比较,
      • 若相匹配,则“左括弧出栈” ,
      • 否则表明不匹配。
  • 表达式检验结束时,若栈空,则表明表达式中匹配正确,
    否则表明“左括弧”有余。
3.代码
void f1(char string[]){
	
	SeqStack *seq; 
	char c;
	int i;
	seq=InitStack();
	for(i=0;string[i];i++)
	{
		
		if(string[i]=='('||string[i]=='{'||string[i]=='['){
			Push(seq,string[i]);	//入栈	
		}else{
			
			if(seq->top==-1){//判断是否栈空
				printf("不配对!\n");
				return; //结束匹配 
			}else{
				Pop(seq,&c);//出栈 
				switch(string[i]){
					case ')' : 
						if(c!='('){
							printf("不匹配\n");
							return;
						}
						break;
					case ']' :
						if(c!='['){
							printf("不匹配\n");
							return;
						}
						break;
					case '}' :
						if(c!='{'){
							printf("不匹配\n");
							return;
						}
						break;
					default :
						printf("不匹配\n");
						return;
				}	
			}
		}		
	}
	
	
	if(seq->top!=-1){
		printf("不配对!\n");
		return;
	}
	
	printf("配对成功\n");

 }

三.判断回文

1.问题描述

判断一个字符串是否为回文字符串
回文:asddsa asdsa

2.思路
  • 将字符串的前半段(strlen(string)/2)入栈
  • 将后半段(strlen(string)/2+strlen(string)%2)与栈顶元素比较,如果都想要
  • strlen(string)/2+strlen(string)%2 加strlen(string)%2是为了区别长度为奇数和偶数的情况
3.代码
int f1(char string[]){
	SeqStack *seq; 
	seq=InitStack();
	int i;
	char c;
	for(i=0;i<strlen(string)/2;i++){
		Push(seq,string[i]);
	}
	
	for(i=i+strlen(string)%2;string[i];i++){
		Pop(seq,&c);
		if(c!=string[i]){
			printf("不是回文\n");
				break;
		}		
	}
	
	if(i==strlen(string))
		printf("是回文\n");
} 

四.进制转换

1.问题描述

将10进制转为2(任意)进制

2.思路
  • 将该数对二取余结果入栈
  • 该数=该数/2;
  • 将栈内结果输出
3.代码
void Convert(int num){
	int i;
	while(num){
		i=num%RADIX;
		num=num/RADIX;
		Push(SS,i); 	
	}
} 
int main(void){
	
	int i,num;
	SS=InitStack();
	//printf("请输入要转换的数\n");
	//scanf("%d",&num);
	for(num=0;num<16;num++){
		Convert(num);
		while(SS->top!=-1){
			printf("%d",i,Pop(SS,&i));
		}
		printf("\n");
	}
}

五.杨辉三角

1.问题描述

这里写图片描述

2.思路

这里写图片描述

3.代码
int main(void){
	CSeQeue *qS;
	Elemtype e,s;
	qS=InitSeQueue();
	InSeQueue(qS,0);//入队 
	InSeQueue(qS,1);
	InSeQueue(qS,0);
	int i,h=8;
	for(i=0;i<h;i++){
		do{
		QutSeQueue(qS,&s);//出队 
		GetSeQueue(qS,&e);//取出队头元素(不出对) 
		if(e!=0)
			printf("%4d",e);
		else
			printf("\n");
		InSeQueue(qS,s+e);
		}while(e!=0); 
		InSeQueue(qS,e);
	}
 	while(!EmptySeQueue(qS)){
		QutSeQueue(qS,&s);
		if (s!=0) 
			printf("%4d",s);
      }
      printf("\n");

}

六.源代码

test3

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值