栈、队列、串专题

题目:设有一个元素类型为整型的栈S,设计一个算法,借助另一个栈实现把该栈的所有元素从栈顶到栈底按从小到大次序排列起来

代码展示:(注意来回倒时候终止条件)

void SortByAnotherStack(Stack &S1,Stack &S2)
{
    if(S1.top==-1 || S1.top==0) return;
    int t,temp;
    while(S1.top>=0)
    {
        Pop(S1,t);
        if(S2.top==-1)
        {
            Push(S2,t);
            continue;
        }
        temp = t;
        int flag = S1.top;
        if(temp>S2.data[S2.top])
        {
            while(temp>S2.data[S2.top])
            {
                int k;
                Pop(S2,k);
                Push(S1,k);
                if(S2.top==-1)break;
            }
            Push(S2,temp);
        }
        else
        {
            Push(S2,temp);
        }
        while(S1.top>flag)
        {
            int m;
            Pop(S1,m);
            Push(S2,m);
        }
    }
}

题目:设一个栈的输入序列为1,2,3…n,编写算法,判断序列,p1,p2,…pn是否是合理的栈输出序列

代码展示:

bool IsTureReverse(Stack &S,int *arr)
{
    if(ArrLength>S.top+1)
    {
        return 0;
    }
    int i = 0;
    int x;
    while(S.top>=0)
    {
        if(S.data[S.top]!=arr[0])
        {
            Pop(S,x);
        }
        else
        {
            break;
        }
    }
    if(S.top==-1)
    {
        return 0;
    }
    else
    {
        while(i<ArrLength)//此处ArrLength采用宏定义
        {
            if(S.data[S.top]==arr[i])
            {
                Pop(S,x);
                i++;
            }
            else
            {
                return 0;
            }
        }
        return 1;
    }
}

题目:输入一个正整数数组,将数组中的各整数连接排成一个大整数,输出能排出的所有整数中最小的一个

代码展示:

int bi(int x)
{
    int i=0;
    while(x)
    {
        x=x/10;
        i++;
    }
    return i;
}
int ex(int p,int x)
{
    int i,s=1;
    for(i=1;i<=x;i++)
        s=s*p;
    return s;
}

void min(int *A,int n)
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n-i-1; j++)
        {
            int m=bi(A[j]);
            int l=bi(A[j+1]);
            if(A[j]*ex(10,l)+A[j+1] > A[j+1]*ex(10,m)+A[j])
            {
                int temp=A[j];
                A[j]=A[j+1];
                A[j+1]=temp;
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%d",A[i]);
    }
}
int main()
{
    int arr[] = {1,43,2,56,7,10};
    min(arr,6);
}

题目:给定一个整数的一维数组A[n],将其中所有整数循环左移p个位置

代码展示:

void reverse(int *arr,int i,int j)
{
    while(i<j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        i++;j--;
    }
}
reverse(arr,0,p-1);
reverse(arr,p,n-1);
reverse(arr,0,n-1);

题目:设整数序列用数组存,设计算法把所有小于X1的放在前面,大于X2的放在后面,两者之间的放中间

代码展示:

void dispose(int *arr,int n,int X1,int X2)
{
    int i = 0; int j = n-1; int k = 0;
    while(i<j)
    {
        while(arr[i]>=X1 && arr[i]<=X2)
        {
            i++;
        }
        if(arr[i]<X1)
        {
            int temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
            k++;i++;
        }
        if(arr[i]>X2)
        {
            int temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
            j--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值