数据结构(20)栈的简单应用
1、有5个元素,其入栈次序依次为A,B,C,D,E,在各种可能的出栈次序中,第一个出栈元素为C且第二个出栈元素为D的出栈序列有哪几个?解析:第一个元素为C说明在C出栈之前,栈中元素依次从栈底到栈顶为A,B,C,所以AB元素的出栈序列只能是B在A之前出栈这一种情况;第二个出栈元素为D,说明C出栈后,D接着入栈,出栈;综合分析可得:出栈的顺序有种:CDEBA,CDBEA,CDBAE2、若元素的进栈序列
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;
}
你,总要埋头去做一些事情,不是吗
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)