- 括号匹配(使用了顺序栈)
注:C语言中输出一个字符是printf("m:%c\n",m);
输出一个字符串是printf("L.data:%s\n",L.data);
- 思路:三种异常情况: (1)数组中的括号与出栈的括号不匹配
(2)数组中已无元素但栈中还有元素;
(3)栈中已无元素但数组中还有元素; - 思路流程图:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct zhnode
{
char data[maxsize];
int top;
}zhnode,*zhlink;
void init(zhnode &L) //初始化
{
L.top=-1;
}
void enter(zhnode &L,char e) //进栈
{
L.data[++L.top]=e;
}
char out(zhnode &L) //出栈
{
char x=L.data[L.top--];
return x;
}
bool empty(zhnode L) //判断栈是否为空
{
if(L.top==-1)
return true;
else
return false;
}
bool match(char brack[],zhnode L)
{
int i=0;
char m='a';
// printf("OK1!\n");
// printf("brack:%s",brack);
while(brack[i]!='\0')
{
// printf("OK2!\n");
if(brack[i]==')')
m='(';
else if(brack[i]==']')
m='[';
else if(brack[i]=='}')
m='{';
if (brack[i]=='('||brack[i]=='['||brack[i]=='{')
{
enter(L,brack[i]);
// printf("L.data:%s\n",L.data);
}
else
{
if (empty(L)==true)
{
printf("匹配失败!!\n");
return false;
}
// printf("m:%c\n",m);
char x=out(L);
// printf("x:%c\n",x);
if(x!=m)
{
printf("匹配失败!!\n");
return false;
// printf("ok!");
}
}
i++;
}
if (empty(L)!=true)
{
printf("匹配失败!!\n");
return false;
}
else
{
printf("匹配成功!!\n");
return true;
}
}
int main()
{
zhnode L;
char brack[10],b;
int i=0;
scanf("%s",&brack);
init(L);
match(brack,L);
return 0;
}
- 数值进制转换(使用了顺序栈)
函数:
void conversion(zhnode &L)
{
int x,m;
printf("请输入x:\n");
scanf("%d",&x);
printf("请输入进制:\n");
scanf("%d",&m);
while(1)
{
int a=x%m;
enter(L,a);//进栈
int b=x/m;
if(b==0)
break;
x=b;
}
}
整体代码:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct zhnode
{
int data[maxsize];
int top;
}zhnode,*zhlink;
void init(zhnode &L) //初始化
{
L.top=-1;
}
void enter(zhnode &L,int e) //进栈
{
L.data[++L.top]=e;
}
int out(zhnode &L) //出栈
{
char x=L.data[L.top--];
return x;
}
bool empty(zhnode L) //判断栈是否为空
{
if(L.top==-1)
return true;
else
return false;
}
void conversion(zhnode &L)
{
int x,m;
printf("请输入x:\n");
scanf("%d",&x);
printf("请输入进制:\n");
scanf("%d",&m);
while(1)
{
int a=x%m;
enter(L,a);//进栈
int b=x/m;
if(b==0)
break;
x=b;
}
}
bool match(char brack[],zhnode L)
{
int i=0;
char m='a';
// printf("OK1!\n");
// printf("brack:%s",brack);
while(brack[i]!='\0')
{
// printf("OK2!\n");
if(brack[i]==')')
m='(';
else if(brack[i]==']')
m='[';
else if(brack[i]=='}')
m='{';
if (brack[i]=='('||brack[i]=='['||brack[i]=='{')
{
enter(L,brack[i]);
// printf("L.data:%s\n",L.data);
}
else
{
if (empty(L)==true)
{
printf("匹配失败!!\n");
return false;
}
// printf("m:%c\n",m);
char x=out(L);
// printf("x:%c\n",x);
if(x!=m)
{
printf("匹配失败!!\n");
return false;
// printf("ok!");
}
}
i++;
}
if (empty(L)!=true)
{
printf("匹配失败!!\n");
return false;
}
else
{
printf("匹配成功!!\n");
return true;
}
}
int main()
{
zhnode L;
char brack[10],b;
int i=0;
// scanf("%s",&brack);
init(L);
conversion(L);
// match(brack,L);
while(empty(L)!=true)
{
printf("%d",out(L));
}
return 0;
}
- 算术表达式
(1)后缀表达式
思路图:
char decide_prior(char a,char b) //判断两个运算符的优先级
{
if(a=='+'||a=='-')
{
if((b=='*')||(b=='/'))
return '<';
if(b=='+'||b=='-')
return '=';
}
if(a=='*'||a=='/')
{
if((b=='*')||(b=='/'))
return '=';
if(b=='+'||b=='-')
return '>';
}
}
void late_evalent(zhnode &L,char a[]) //后缀表达式
{
char resault[maxsize];
int j=0;
for(int i=0;a[i]!='\0';i++)
{
if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))
{
resault[j++]=a[i];
// printf("resault[%d]=%c\n",j-1,resault[j-1]);
// printf("====================\n");
}
else if((a[i]>=40&&a[i]<=43)||(a[i]==45)||(a[i]==47))
{
if(empty(L)==true)
{
enter(L,a[i]);
}
else
{
if(a[i]!='('&&a[i]!=')')
{
if (L.data[L.top]=='(')
{
enter(L,a[i]);
}
else
{
while(decide_prior(L.data[L.top],a[i])=='>'||decide_prior(L.data[L.top],a[i])=='=')
{
resault[j++]=out(L);
// printf("resault[%d]=%c\n",j-1,resault[j-1]);
// printf("====================\n");
}
enter(L,a[i]);
if(decide_prior(L.data[L.top],a[i])=='<')
{
enter(L,a[i]);
}
}
}
else
{
if(a[i]=='(')
enter(L,a[i]);
else if(a[i]==')')
{
while(1)
{
char O1=out(L);
if(O1!='(')
{
resault[j++]=O1;
// printf("resault[%d]=%c\n",j-1,resault[j-1]);
// printf("====================\n");
}
if(O1=='(')
{
break;
}
}
}
}
}
}
}
while(empty(L)!=true)
{
resault[j++]=out(L);
printf("resault[%d]=%c\n",j-1,resault[j-1]);
printf("====================\n");
printf("%c\n",(L.data[L.top]));
}
for(int i=0;resault[i]!='\0';i++)
{
printf("%c ",resault[i]);
}
printf("\n");
}
- 递归
#include<stdio.h>
/*斐波那契数列
int Fib(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else if (n>1)
return Fib(n-1)+Fib(n-2);
} */
/*阶乘*/
int factoria(int n)
{
if(n==0||n==1)
return 1;
else
return n*factoria(n-1);
}
int main()
{
//int n=Fib(3); //斐波那契数列
int n2=factoria(3);//阶乘
printf("%d\n",n2);
return 0;
}