#include
#include
#include
#define MaxSize 10
using namespace std;
typedef struct {
char data[MaxSize];
int top;
}SqStack;
//初始化栈
void IniStack(SqStack &s)
{
s.top=0;
}
//判断栈是否为空
bool StaxkEmpty(SqStack s){
if(s.top==0)
return true;
else
return false;
}
//新元素入栈
bool Push(SqStack &s,char &x){
s.data[s.top]=x;
s.top++;
return true;
}
//栈顶元素出栈,用x返回
bool Pop(SqStack &s,char &x){
x=s.data[s.top-1];
s.top--;
}
//匹配算法
bool bracketCheck(char str[],int length){
SqStack s;
IniStack(s);
for(int i=0;i<length;i++){
if(str[i]=='('||str[i]=='{'||str[i]=='['){
Push(s,str[i]); //如果是左括号,入栈
}
else{
if(StaxkEmpty(s))//如果是右括号并且栈为空
return false;
char topELem;
Pop(s,topELem);
if(str[i]==')'&&topELem!='(')
return false;
if(str[i]=='}'&&topELem!='{')
return false;
if(str[i]==']'&&topELem!='[')
return false;
}
}
return StaxkEmpty(s);
}
int main()
{ char str[MaxSize];
int n;
scanf("%s",str);
scanf("%d",&n);
if(bracketCheck(str,n))
printf("匹配成功");
else
printf("匹配失败");
return 0;
}
中缀表达式 | 后缀表达式 | 前缀表达式 |
---|---|---|
a+b | ab+ | +ab |
a+b-c | ab+c- | -+abc |
/*计算任意输入的整数的阶乘
#include
using namespace std;
int main()
{
int n;
cin>>n;
fac_fun(n);
return 0;
}
int fac_fun(int m)
{
if(m==0||m==0)
return 1;
else
return m*fac_fun(m-1);
}
int FeiBo(int f)
{ if (f==0)
return 0;
else if (f == 1)
return 1;
else
return FeiBo(f - 2) + FeiBo(f - 1);
}
int main()
{ int key = 0;
scanf("%d", &key);
num = FeiBo(key);
return 0;
}
总结:
- 递归必须满足两个条件:① 递归表达式(递归体) ② 边界条件(递归出口)
- 递归次数过多容易溢出
- 递归效率低是因为递归调用过程中包含很多重复计算
列在计算机系统中的应用非常广泛,以下仅从两个方面来简述队列在计算机系统中的作用:第一个方面是解决主机和外部设备之间速度不匹配问题;第二个方面是解决CPU竞争问题。
① 以主机和打印机之间速度不匹配为例来说明。主机输出数据的速度远远大于打印机的打印速度,所以需要建立一个打印数据缓冲区,主机将数据缓冲区写满了可以去做其他的事情,而这个数据缓冲区就是一个队列。
② CPU资源的竞争就是一个典型的例子。像进程切换、线程切换的本质原因就是为了提高CPU的有效利用率。比如有A,B,C三个任务,但是每个任务中间都有IO请求,这样三个进程(或线程)排成一个队列(当然了实际的处理机调度是很复杂的,但是我们这儿可以简化为A先执行,遇到IO换B,依次循环执行,直到所有任务结束),这个过程中,我们看到需要处理机的任务也是一个队列的概念。还有实时交互系统,就是所有任务也是可以简化看作在一个队列中,比如按照时间片去执行这个队列,在用户端呈现出一种实时的多人操作的感官