1.括号配对
扫描每个字符,遇到左括号进栈,遇到右括号时检查栈顶是否为相应左括号,若是:退栈,否则匹配错误,最后若栈不空也为匹配错误。
bool BracketCheck(char str*){
Initstack(s);
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case '(': push(s,'(');break;
case '{': push(s,'{');break;
case '[': push(s,'[');break;
case ')': pop(s,x);if(x!='(') return false;break;
case '}': pop(s,x);if(x!='{') return false;break;
case ']': pop(s,x);if(x!='[') return false;break;
default: break;
}
i++;
}
if(!isEmpty(s)){
printf("括号不匹配");
return false;
}
else{
printf("括号匹配");
return true;
}
}
bool isValid(char * s){
int i=0,top=0;
char *stack[strlen(s)];
while(s[i]!='\0'){
if(s[i]=='('||s[i]=='['||s[i]=='{') stack[top++]=s[i];
else {
if(--top<0) return false;
if(s[i]==')'&&stack[top]!='(') return false;
if(s[i]==']'&&stack[top]!='[') return false;
if(s[i]=='}'&&stack[top]!='{') return false;
}
i++;
}
return (!top);
}
2.车厢调度,两侧单向行驶道,有n节硬座和软座车厢等待调度,对n节车厢做入栈出栈操作,使所有软座排在硬座车厢之前
所有车厢依次前进逐一检查,硬座车厢入栈,等待调度,检查完之后对硬座车厢出栈。
void Train_arrange(char *train){
char *p=train,*q=train,c;
stack s;
Initstack(s);
while(p!=NULL){
if(*p=='H') push(s,'H');
else *(q++)=*p;
p++;
}
while(!stackEmpty){
pop(s,c);
*(q++)=c;
}
}
3.利用栈实现以下递归函数的非递归计算(可以把结构做数组用,结构定义可以在函数内)
设置一个栈用于保存n和对应的Pn(x)值,栈中相邻元素的Pn(x)有题中关系。然后边出栈边计算Pn(x),栈空时得到答案。
(借图https://blog.csdn.net/qq_33514421)
double p(int n,double x){
struct stack{
int no;
double val;
}st[MaxSize]; // 顺序栈
int top=-1,i;
double fv1=1,fv2=2*x; //通过初始值计算其余值
for(i=n;i>=2;i--){ //存入n的值
top++;
st[top].no=i;
}
while(top>=0){ //每次循环通过两个值计算出新值存到val中
st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
fv1=fv2;
fv2=st[top].val;
top--; //循环结束时fv2中保存着最后结果
}
if(n==0) return fv1; //条件 1
return fv2;
}
4.汽车过江渡船问题
汽车轮渡口,每次可10辆过江。同类车先到先上船。客车先于货车上传,每上四辆客车,可以上一辆货车。客车不足四辆则货车代替。若无货车等待,允许所有客车上船。
设数组q最大下标为10。假设客车队列为q1,货车队列为q2。若q1充足,则每取四个q1后取一个q2,直到q长度为10.若q1不足,则直接用q2补齐。
Queue q,q1,q2; //q1客车队列 q2货车队列
void manager(){
int i=0,j=0; //i计数4辆,j计数车总数
while(j<10){
if(!QueueEmpty(q1)&&i<4){ //上四辆客车
Dequeue(q1,x);
Enqueue(q,x);
i++;
j++;
}
else if(i==4&&!QueueEmpty(q2)){ //四辆客车后上一辆货车
Dequeue(q2,x);
Enqueue(q,x);
i=0; //每上一辆货车i重新计数
j++;
}
else{ //客车队列空货车货车队列空
while(j<10&&i<4&&!QueueEmpty(q2)){
Dequeue(q2,x);
Enqueue(q,x);
i++;
j++;
}
i=0;
}
if(QueueEmpty(q1)&&QueueEmpty(q2)) j=11; //都不足你也得走
}
}