数据结构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");
}