stl里面的栈中没有清空的函数, 需要自己编写函数清空(while循环返回pop), 更常见的做法是重新定义一个栈,这样的时间复杂度就是O(1)
栈的基本操作,出栈入栈判空和求栈的长度,和取栈顶元素以及清空
出栈和取栈顶元素是需要判空的,否则可能会出现段错误
要清楚的知道栈和队列顶指针在哪里, 以及队尾指针又在哪里;
队列队首指针front指向队首元素的前一个位置(如果为空,栈也是会先指向外面)(不然出队的时候,出队次数和元素个数不等,出队次数会比元素个数少一,且对内元素的个数刚好等于两指针之差),和一个队尾指针rear指向队尾元素(和栈一样都是先++再放)
因此取队首元素的时候实际上是return q[front+1];而取队尾元素则是return q[rear];
栈和队列一样,取元素和出元素的时候必须先判断空,否则会出现段错误
栈和队列一样,stl中没有清空函数,需要自己定义
选择题:
1.
选B
数据结构包括三方面 :逻辑结构,存储结构和数据的运算
什么是逻辑结构?
逻辑结构指数据元素之间的逻辑关系,分为线性结构和非线性结构
什么是线性结构和非线性结构?
线性结构是一个有序数据元素的集合
1.集合中必存在唯一的一个"第一个元素";
2.集合中必存在唯一的一个"最后的元素";
3.除最后元素之外,其它数据元素均有唯一的"后继";
4.除第一元素之外,其它数据元素均有唯一的"前驱"。
数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。
如(a0,a1,a2,.....,an),a0为第一个元素,an为最后一个元素,此集合即为一个线性结构的集合。
相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后继
最典型的线性结构是线性表,集合,树和图都是典型的非线性结构
线性结构又可以分成一般线性表,受限线性表(栈和队列以及串),线性表的推广(数组)
因此可以说栈和队列具有相同的逻辑结构,都属于受限线性表,也都属于逻辑结构中的一种,线性结构,顺便一说数组是逻辑结构而不是存储结构。
什么是存储结构?
存储结构是数据结构在计算机中的表示
数据的存储结构是数据的逻辑结构在计算机的表示,数据的存储结构分为顺序存储和链式存储,以及索引存储和散列存储
什么是顺序存储,链式存储和索引存储以及散列存储?
顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元,元素与元素之间的关系通过存储单元的邻接来体现
链式存储:不要求逻辑上相邻在物理位置上也相邻,借助元素存储地址的指针来表示元素之间的逻辑关系
索引存储:存储元素信息的同时,建立附加的索引表,通过索引表找到元素
散列存储:通过元素的关键词直接计算出元素的存储地址,又称哈希存储
什么是数据的运算?
数据的运算包括运算的定义和实现,运算定义针对逻辑结构,指出运算的功能,运算的实现针对存储结构,指出运算的具体操作步骤
因此虽然栈和队列均属于同一个逻辑结构(线性结构中的受限线性表),但是它们运算的功能和运算的步骤都不相同,即数据的运算不同。
出自王道P2
2.
栈是限制存储点的线性结构
3.
选C
因为ABD都差不多,都可以指到表头,且删除表尾结点,就是说更适合而已,其实都可以作为链栈
4.
选C
若P3 = 1,则输入序列为P1, P2, 1 ,P4, ..., Pn, 由输出序列可知,p1,p2,p3先进,
p3出,然后p2p1可以接着出,那么p1的值可以是3,所以D错误
若p1 = 2,p1, p2先进,p3出,p3接下来的输出序列就是2了,p2堵住了p1, 所以p1不可能为2
题目给出了讨论点p3,应该根据p3的左右两侧进行讨论,明显的,只有p3的左右两侧的值可能是2
5.
选C
C语言标识符的要求就是只能英文字母,数字和下划线组成,但是首字符不能是数字,可以是字母或者下划线
根据公式可以得知,3个字符可以得到栈的5种输出结果,分别是
n1_(连续进出三次)
1n_(进进出出进出)
_1n(进进进出出出)
1_n(进进出进出出)
n_1(进出进进出出)
其中2和4均属于非法的标识符,即只有三种
6.
选C
给出入栈顺序,和出栈顺序(入队顺序是先入先出,因此入队顺序就是出栈顺序)
7.
选C
从讨论点的两侧进行讨论
若p1 = 2,即3旁边的2先出,则此时栈里面只有1,此时可以入栈4到n,可以选择出栈1,或者4
到n的任何一个出栈,因此,p3可以等于1,或者4到n
若p1 = 4,即3旁边的4先出,那么p3可以为2,即432
综上所述,p3可以为除了3以为的任何数
8.
采用非递归的方法重写递归程序时,必须使用栈
错误
深度优先搜索的题也可以用广度优先搜索来做呀
栈内存:栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配
可以使用栈模拟递归,可以避免程序因栈内存溢出而程序崩溃,但是模拟递归不一定要用栈
大题:
1.
思路:
利用栈的性质,入栈顺序与出栈顺序相反且对称,如果该链表中心对称,则前半部分的顺序相反应该等于后半部分,因此可以将前半部分序列入栈,然后出栈和后半部分的序列对比,如果都相等则说明中心对称。
代码:
#include<iostream>
#include<stack>
using namespace std;
struct node{
char data;
node *next;
};
node* Create(char a[], int n) {
node *head = new node;
node *p = head;
for(int i = 0; i < n; i++) {
node *q = new node;
q->data = a[i];
p->next = q;
p = q;
}
p->next = NULL;
return head;
}
void Print(node *head) {
node *p = head->next;
while(p != NULL) {
if(p != head->next)
cout << " ";
cout << p->data;
p = p->next;
}
cout << "\n";
}
bool CentralSymmetry(node *head, int n) {
stack<char > st;
node *p = head->next;
int cnt = n / 2;
for(int i = 0; i < cnt; i++) {//将左侧的值都放入栈中;
st.push(p->data);
p = p->next;
}
if(n % 2 != 0 && p != NULL)//如果序列是奇数序列的话,中间哪个数不算,先走一步;
p = p->next;
while(p != NULL) {
if(p->data == st.top()) {//出栈顺序和入栈顺序相反且对称;
p = p->next;
st.pop();
} else
return false;
}
return true;
}
int main() {
int n = 6;
char a[n] = {"xyxxyx"};
node *head = Create(a, n);
Print(head);
if(CentralSymmetry(head, n) == true)
cout << "Yes";
else
cout << "No";
return 0;
}