数据结构(20)栈的简单应用

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

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值