2.栈和队列
2.1 栈和队列构造
1.手写一个最小栈
int stack[maxsize];int top=-1; //声明加初始化
stack[++top]=x; //进栈
x=stack[top--]; //出栈
2.利用两个栈模拟一个队列
入队算法
int EnQueue(Stack S1,Stack S2,ElemType e){
if(!StackOverflow(S1)){
Push(S1,x);
return 1;
}
if(StackOverflow(S1)&&!StackEmpty(S2)){
printf("队列满");
return 0;
}
if(StackOverflow(S1)&&StackEmpty(S2)){
while(!StackEmpty(S1)){
Pop(S1,x);
Push(S2,x);
}
}
Push(S1,x);
return 1;
}
出队算法
void DeQueue(Stack S1,Stack S2,ElemType &x){
if(!StackEmpty(S2)){
Pop(S2,x);
}
else if(Stackmpty(S1)){
printf("队列为空");
}
else{
while(!StackEmpty(S1)){
Pop(S1,x);
Push(S2,x);
}
Pop(S2,x);
}
}
判断队列为空
int QueueEmpty(Stack S1,Stack S2){
if(StackEmpty(S1)&&StackEmpty(S2))
return 1;
else
return 0;
}
3.用两个队列模拟栈的操作.
int Push(Queue q1,Queue q2,ElemType x) //进栈操作
{
if(isEmpty(q1)) //q1为空 则X直接进q1
{
Enque(q1,x);
return 1;
}
else if(!StackOverflow(q2)) //q2不满 则进q2
{
Enque(q2,x);
return 1;
}
else
{
printf("模拟栈已满");
return 0;
}
}
int pop(Queue q1,Queue q2,Elemtype &x) //出栈
{
if(!isEmpty(q1)) //q1不为空 则出队就好
{
Deque(q1,x);
return 1;
}
else
{
if(isEmpty(q2))
{
printf("模拟栈为空");
return 0;
}
else
{
ElemType tp;
while(!isEmpty(q2))
{
Deque(q2,tp);
Enque(q1,tp);
}
x = tp;
while(!isEmpty(q1))
{
Deque(q1,tp);
if(tp!=x)
Enque(q2,tp);
}
return 1;
}
}
}
int ISEmpty(Queue q1,Queue q2)
{
if(isEmpty(q1)&&isEmpty(q2))
return 1;
else
return 0;
}
2.2 栈问题
1.312模式:设进栈序列为1,2,3....,n ,出栈为P1,P2,....Pn.
证明:不存在Pj<Pk<Pi(i<j<k) 即123序列中不会出现312
写出该判断的算法
主要的判断依据是:若Xi已经出栈,则Xi前面的尚未出栈的元素一定逆置有序的出栈
int judge_312(int A[],int n)
{
int flag=0;
int max;
int min;
int i=0;
if(n==2)
return 1;
for(i=0;i<n;i++)
{
if(A[i]>A[n])
{
flag=1;
}
if(flag==1&&A[i]<A[n])
return 0;
}
return judge_312(A,n-1);
}
2.中缀表达式转后缀表达式
int priority(char str1,char str2)
{
if(str2=='+' || str2=='-')
{
if(st1=='+' || str1=='-' || str1=='*' str1=='/')
return 0;
}
else if(str2 == '*' || str2 =='/')
{
if(st1=='+' || str1=='-')
return 1;
else
return 0;
}
}
void prefixTosuffix(char exp[],char exp2[]) //中缀转后缀
{
char stack[maxsize],top=-1; //符号栈
int i,k;k=i=0;
while(exp[i]!='#') //‘#’为表达式结束标记
{
if(exp[i]>='0' && exp[i]<=9)
{
exp2[k++] = exp[i];
}
else
{
if(exp[i]='(') //‘(’ 则加入符号栈
{
exp2[k++] = stack[top--];
}
else if(exp[i]==')') //‘)’ 则持续退栈 直到遇到‘(’
{
while(stack[top]!='(')
exp2[k++] = stack[top--];
top--;
}
else
{
if(top==-1 || priority(stack[top],exp[i])==1) //如果栈空 或者当前的符号
{ //的优先级别大于栈顶的优先级
stack[++top] = exp[i]; //就入栈
}
else if(priority(stack[top],exp[i])==0) //反之 出站
{
exp2[k++] = stack[top--];
stack[++top] = exp[i];
}
}
}
i++;
}//while
while(top>-1) //把剩余的字符全都转化到表达式中
exp2[k++] = stack[top--];
exp2[k] = '#'; //给表达式字符加上‘#’结束符
}
3.用栈实现进制转换。
//十进制转2进制
void tranToB(int N)
{
int stack[maxsize];
int top = -1;
while(N)
{
stack[++top] = N%2;
N = N%2;
}
while(top!=-1)
printf("%d",stack[top--]);
}
4.递归算法求两个正整数m和n的最大公因数。
int gcd(int m,int n){
if (m<n)
return(gcd(n,m));
if(n==0)
return(m);
else
return(gcd(n,m%n));