栈和队列常考面试题(二)

4.判断元素出栈,入栈顺序的合法性,如入栈序列是(1,2,3,4,5),出栈序列是(4,5,3,2,1)是合法序列
入栈序列是(1,2,3,4,5),出栈序列是(1,5,3,2,4)

思路:首先判断栈的长度,如果小于0则退出。根据给定的出栈序列,不断地进行入栈出栈操作,如果所有元素都能全部入栈并且出栈,则说明出栈序列是合法的。
#include<iostream>
using namespace std;
#include<stack>

bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
    if (nLength < 0)     //如果栈中的元素小于0
        return false;
    stack<int> s;
    int i=0, j=0;    //i是入栈,j是出栈
    while (j < nLength)
    {
        while (s.empty() || s.top() != pPop[j])
        {
            if (i == nLength)
                break;
            s.push(pPush[i++]);
        }
        if (s.empty() || s.top() != pPop[j])
            break;
        s.pop();
        j++;
    }
    if (s.empty() && j == nLength)
        return true;
    return false;
}

//测试
void main()
{
    int pPush[5] = { 1, 2, 3, 4, 5 };
    //int pPop[5] = { 4, 5, 3, 2, 1 };
    int pPop[5] = {1,5,3,2,4 };
    cout << IsPopOrder(pPush, pPop, 5) << endl;
}

5.一个数组实现两个栈

思路:数组两端即为两个栈的栈顶,在数组顶端的栈增加元素就是将栈顶指针++,然后将数据放进去,在数组尾部增加元素就是将栈顶指针--;然后放入数据。在数组顶端的栈出栈只需栈顶指针--,在数组尾部的栈出栈只需要栈顶指针++
#include<iostream>
#include<string>
using namespace std;

int A[9] = {0};
int top_s1 = 0, top_s2 = 9;
bool Push(string s,int x)
{
    if (top_s2 - top_s1 == 1)
        return false;   //数组空间已经被占用完
    else
    {
        if (s == "s1")
        {
            top_s1++;
            A[top_s1] = x;
        }
        if (s == "s2")
        {
            top_s2--;
            A[top_s2] = x;
        }
    }
}
int Pop(string s)
{
    if (s == "s1"&&top_s1 == 0 || s == "s2"&&top_s2 == 9)   //没有元素出栈的情况
        return -1;
        
    else
    {
        if (s == "s1")
        {
            --top_s1;
            return A[top_s1 + 1];
        }
        if (s == "s2")
        {
            ++top_s2;
            return A[top_s2 - 1];
        }
    }
}

 

//测试
void main()
{
    Push("s1", 12);
    Push("s1", 2);
    Push("s1", 9);

    Push("s2", 1);
    Push("s2", 33);
    
    cout << Pop("s1") <<"  ";
    cout << Pop("s1") << "  ";
    cout << Pop("s1") << "  ";
    cout << Pop("s1") << "  ";
    cout << endl;
    cout << Pop("s2") << "  ";
    cout << Pop("s2") << "  ";
    cout << endl;
}

posted @ 2016-09-17 14:37  请叫我小小兽  阅读(461)  评论(0编辑  收藏  举报