数据结构编程题系列(三)栈和队列

414 阅读3分钟

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));