1, 若入栈的元素为n,则可得到的输出序列数量为 (2n)!/(n+1)(n!)(n!)。
2, 用两个长度相同的栈S1,S2构造一个队列。在S1中进行入队操作,S2中进行出队操作 ,判断队列空的条件是,S1和S2同时为空,判断队列满的条件是S1和S2同时为满。
void EnQueue(ElemType x)


{
if(!Full(S1))

{//S1未满直接进入
S1.Push(x);
}
else

{
if(Empty(S2)==true)

{
while(!Empty(S1))

{
S2.Push(S1.Pop());
}
S1.Push(x);
}
}
}

ElemType DeQueue()


{
if(!Empty(S2))

{
return S2.Pop();
}
else

{
if(!Empty(S1))

{
while(!Empty(S1))

{
S2.Push(S1.Pop());
}
return S2.Pop();
}
}
}

3.求两个正整数的最大公约数的非递归算法。
#define MAX 100
struct Stack


{
int s;
int t;
};

int gcd(int m,int n)


{
int k;
Stack S[MAX];
int top = -1,tmp;
if(m<n)

{
tmp = m;
m = n;
n = tmp;
}
top++;
S[top].s = m;
S[top].t = n;
while(top>=0&&S[top].t!=0)

{
if(S[top].t!=0)

{
tmp = S[top].s;
m = S[top].t;
n = m%tmp;
top++;
S[top].s = m;
S[top].t = n;
}
}
return S[top].s;
}

4.
n+1,m =0
Akm(m,n) = Akm(m-1,1) m!=0,n=0
Akm(m-1,Akm(m,n-1)),m!=0,n!=0
写非递归算法。
#define MAXSIZE 100
typedef struct


{
int tm;
int tn;
}Stack;

int akm(int m,int n)


{
Stack S[MAXSIZE];
int top = 0;
S[top].tm = m;
S[top].tn = n;
do

{
while(S[top].tm!=0)

{
while(S[top].tn!=0)

{
top++;
S[top].tm = S[top-1].tm;
S[top].tn = S[top-1].tn-1;
}
S[top].tm--;
S[top].tn=1;
}
if(top>0)

{
top--;
S[top].tm--;
S[top].tn = S[top].tn+1;
}
}while(top!=0 || S[top].tm!=0);
top--;
return S[top+1].tn+1;
}
5.写出和下列递归过程等价的非递归过程
void test(int &sum)


{
int k;
scanf("%d",&k);
if(k==0) sum = 1;
else

{
test(sum);
sum = k*sum;
}
printf("%d",sum);
}

分析:程序功能是按照输入的整数,按相反顺序进行累计乘法运算
#define MAXSIZE 100
void test(int &sum)


{
int Stack[MAXSIZE];
int top = -1,k;
sum = 1;
scanf("%d",&k);
while(k!=0)

{
Stack[++top] = k;
scanf("%d",&k);
}
printf("%d",sum);
while(top!=-1)

{
sum *=Stack[top--];
printf("%d",sum);
}
}

6.假设表达式由单字母变量和双目四则运算算符构成,写一个算法,将一个书写正确的表达式转换为逆波兰式。
void ConPoland(char express[],char suffix[])


{
char *p = express,ch1 = *p,ch2;
int k = 0;
InitStack(S);
Push(S,'#');
while(!StackEmpty(S))

{
if(!IsOperator(ch1))
suffix[k++] = ch1;
else

{
switch(ch1)

{
case '(':
Push(S,ch1);break;
case ')':
Pop(S,ch2);
while(ch2!='(')

{
suffix[k++] = ch2;
Pop(S,ch2);
}
break;
default:
while(GetTop(S,ch2)&&precede(ch2,ch1))

{
suffix[k++] = ch2;
Pop(S,ch2);
}
if(ch1!='#')
Push(S,ch1);
break;
}
}
if(ch1!="#')
ch1 = *++p;
}
suffix[k] = '\0';
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述