1、有5个元素,其入栈次序依次为A,B,C,D,E,在各种可能的出栈次序中,第一个出栈元素为C且第二个出栈元素为D的出栈序列有哪几个?

解析:

第一个元素为C说明在C出栈之前,栈中元素依次从栈底到栈顶为A,B,C,所以AB元素的出栈序列只能是B在A之前出栈这一种情况;

第二个出栈元素为D,说明C出栈后,D接着入栈,出栈;

综合分析可得:

出栈的顺序有种:CDEBA,CDBEA,CDBAE

 

2、若元素的进栈序列为A,B,C,D,E,运用栈操作,能否得到栈序列B,C,A,E,D和D,B,A,C,E?   为什么?

解析:

栈的操作有个最大的特点:若当前出栈元素为m,则比m先入栈且还未出栈的元素,则只能按序出栈。

B,C,A,E,D:

B先出栈,则比A先入栈且还未出栈的只有A,A出栈暂无限制

C第二个出栈,则比C先入栈且还未出栈的只有B,B出栈暂无限制

A第三个出栈,则比A先入栈且还未出栈元素不存在,出栈暂无限制

E第二个出栈,则比E先入栈且还未出栈的只有D,D出栈暂无限制

D出栈。

同理分析DBACE即可。


3、假设以I和O分别表示入找和出找操作 找的初态和终态均为空,入找和出找的操作序列可表示为仅由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列。下面所示的序列中哪些是合法的?

  A. IOIIOIOO      B. IOOIOIIO 

  C. IIIOIOIO        D. IIIOOIOO 

解析:

B中入栈一次,紧接着出栈两次,错误。

C中入栈元素没有全部出栈。

4、设单链表的表头指针为L ,结点结构由 data和 next 两个域构成,其中 data 域为字符型 试设计算法判断该链表的全部 n个字符是否中心对称 例如 xyx xyyx 都是中心对称。

思路:若链表的元素数量是奇数,则必然不是中心对称;

           若链表的元素数量为偶数,将链表前一半元素入栈,和后一半元素对比。

#include <iostream>
#include<stack>

using namespace std;

typedef struct LNode
{
    LNode(string  d) { data = d; next = NULL; }
    string  data;

    struct LNode *next;

}LNode, *LinkList;

bool is_symmetry(LinkList L,int n)
{
    if (n % 2 == 1)
        return false;
    stack<string> myStack;
    for(int i = 0 ; i < n/2;++i)
    {
        myStack.push(L->next->data);
        L->next = L->next->next;
    }
    while (L->next!= NULL && myStack.top() == L->next->data)
    {
        myStack.pop();
        L->next = L->next->next;
    }
    if (L->next == NULL)
        return true;
    else
        return false;
}

int main()
{
    LinkList L = new  LNode(" "); 
    L->next = new  LNode("a");
    L->next->next = new  LNode("b");
    L->next->next->next = new  LNode("c");
    L->next->next->next->next = new  LNode("d");
    L->next->next->next->next->next = new  LNode("d");
    L->next->next->next->next->next->next = new  LNode("c");
    L->next->next->next->next->next->next->next = new  LNode("b");
    L->next->next->next->next->next->next->next->next = new  LNode("a");
    int  n = 8;
    cout << is_symmetry(L, n) << endl;
    return 0;
}

 

 

 

你,总要埋头去做一些事情,不是吗

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐