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

来源:互联网 发布:linux卸载光盘命令 编辑:程序博客网 时间:2024/06/18 16:35

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

一.前言

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

二.括号匹配

1.问题描述

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

2.思路

  1. 凡出现左括弧,则进栈;
  2. 凡出现右括弧,首先检查栈是否空
    • 若栈空,则表明该“右括弧”多余,
    • 否则和栈顶元素比较,
      • 若相匹配,则“左括弧出栈” ,
      • 否则表明不匹配。
  3. 表达式检验结束时,若栈空,则表明表达式中匹配正确,
    否则表明“左括弧”有余。

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.思路

  1. 将字符串的前半段(strlen(string)/2)入栈
  2. 将后半段(strlen(string)/2+strlen(string)%2)与栈顶元素比较,如果都想要
  3. 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.思路

  1. 将该数对二取余结果入栈
  2. 该数=该数/2;
  3. 将栈内结果输出

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