【数据结构】数据结构练习题2——栈+队列

一、选择题

1.假定一个循环顺序队列的队首和队尾指针分别为f和r,则判断队空的条件是(D)
A f+1==r
B r+1==f
C f==0
D f==r

2.假定一个链队(有头结点)的队首和队尾指针分别为front和rear,则判断队空的条件是(A)
A front==rear
B front!=NULL
C rear!=NULL
D front==NULL

3.循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是 (A)
A (rear-front+m)%m
B rear-front+1
C rear-front-1
D rear-front

4.判定一个循环队列QU(最多元素为m, m= =Maxsize-1)为满队列的条件是 (A)
A ((rear- front)+ Maxsize)% Maxsize = =m
B rear-front-1= =m
C front= =rear
D front= = rear+1

5.一个队列的数据入列序列是1,2,3,4,则队列的出队时输出序列是 (B)
A 4,3,2,1
B 1,2,3,4
C 1,4,3,2
D 3,2,4,1

6.从一个栈顶指针为HS的链栈中删除一个结点时,用x保存被删结点的值,则执行什么。(不带空的头结点) (D)
A x=HS; HS= HS—>next;
B x=HS—>data;
C HS= HS—>next; x=HS—>data;
D x=HS—>data; HS= HS—>next;

7.从一个循环顺序队列删除元素时,首先需要(B)
A 前移一位队首指针
B 后移一位队首指针
C 取出队首指针所指位置上的元素
D 取出队尾指针所指位置上的元素

8.在一个循环顺序队列中,队首指针指向队首元素的什么位置。(C)
A 前一个
B 后一个
C 当前
D 后面

9.当利用大小为N的一维数组顺序存储一个栈时,假定用top==N表示栈空,则向这个栈插入一个元素时,首先应执行什么语句修改top指针。 (B)
A top++
B top–
C top=0
D top

10.栈和队列的共同点是 (C)
A 都是先进后出
B 都是先进先出
C 只允许在端点处插入和删除元素
D 没有共同点

11.一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是 (C)
A edcba
B decba
C dceab
D abcde

12.队列操作的原则是(A)
A 先进先出
B 后进先出
C 只能进行插入
D 只能进行删除

13.判定一个顺序栈ST(最多元素为m0)为空的条件是 (B)
A top!=0
B top= =0
C top!=m0
D top= =m0-1

14.栈结构通常采用的两种存储结构是(A)
A 顺序存储结构和链式存储结构
B 散列方式和索引方式
C 链表存储结构和数组
D 线性存储结构和非线性存储结构

15.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为 (C)
A i
B n-i
C n-i+1
D 不确定

二、编程题

判断字符串镜像——栈

【注意】本题务必使用顺序栈或者链式栈的一种来实现,否则不给分。

【问题描述】试写一个算法,识别依次读入的一个以“@”为结束符的字符序列是否为形如 “序列1&序列2” 模式的字符序列。其中序列1和序列2都不含字符 “&”,且序列2是序列1的逆序列。例如,“ a+b&b+a ”是属该模式的字符序列,而 “1+3&3-1”则不是。

【输入形式】
以@为结尾的一串字符

【输出形式】
若符合模式则输出字符串长度,否则输出no

【样例输入】
a+b&b+a@

【样例输出】
3

#include<iostream>
#include<string>
using namespace std;

class array_stack
{
public:
	array_stack(int size);
	bool push(char str);
	void pop();
	char top();
	bool is_empty();
	bool is_full();

private:
	struct STACK
	{
		char data;
		struct STACK * next;
	}*p, *q, *head;
	int _size;
	int max_size;
};

array_stack::array_stack(int size)
{
	p = NULL; q = NULL;
	head = NULL;
	max_size = size;
	_size = 0;
}


inline bool array_stack::push(char str)
{
	if (is_full())
		return false;
	p = new STACK;
	p->data = str;
	p->next = NULL;
	if (head == NULL)
		head = p;
	if (q == NULL)
		q = p;
	else
	{
		q->next = p;
		q = p;
	}
	_size++;
	return true;
}

void array_stack::pop()
{
	if (is_empty())
		return;
	if (head->next == NULL)	// 只有一个元素时候
	{
		delete head;
		head = NULL;
		p = NULL;
		q = NULL;
		return;
	}
	for (p = head; p->next != q; p = p->next);
	delete q;
	p->next = NULL;
	q = p;
	_size--;
}

char array_stack::top()
{
	if (is_empty())
		return '0';
	for (p = head; p->next != NULL; p = p->next);
	return p->data;
}

bool array_stack::is_empty()
{
	if (head == NULL)
		return true;
	return false;
}

bool array_stack::is_full()
{
	if (_size < max_size)
		return false;
	return true;
}

int main()
{
	string str;
	int i;
	array_stack sta1(50);
	int str_length = 0;
	cin >> str;
	for (i = 0; str[i] != '&'; i++)
	{
		sta1.push(str[i]);
		str_length++;
	}

	for (i = str.find('&') + 1; str[i] != '@'; i++)
	{
		if (str[i] == sta1.top())
			sta1.pop();
	}
	if (sta1.is_empty())
		cout << str_length << endl;
	else
	{
		cout << "no" << endl;
	}
	return 0;
}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小天才才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值