赞
踩
本部分内容仅选本人觉得有点意思的题目。
1,抽象数据类型 2,逻辑结构 3,存储结构 4,运算
抽象数据类型:抽象数据组织及与之相关的操作
逻辑结构:分为线性结构和非线性结构
存储结构:顺序存储,链式存储,索引存储,散列存储
a[top++] = x;相当于a[top] = x; top++;
a[++top] =x;相当于top++,a[top] =x;
a[top–] = x;相当于a[top] = x; top–;
a[–top] = x;相当于top–,a[top] =x;
1,只有表头结点指针,没有表尾指针的双向循环链表//双向,所以操作很方便
2,只有表尾结点指针,没有表头指针的双向循环链表//双向,所以操作很方便
3,只有表头结点指针,没有表尾指针的单向循环链表//要找到尾结点操作头结点,需要遍历一遍。
4,只有表尾结点指针,没有表头指针的单向循环链表//有表尾的单向循环,直接操作的就是表头。
x = 1 n + 1 \frac{1}{n+1} n+11 * (C2n,n) --> 1 4 \frac{1}{4} 41 *C(6,3)
C(n,m) = n ! m ! ( n − m ) ! \frac{n!}{m!(n-m)!} m!(n−m)!n! -->C(6,3) = 6 ∗ 5 ∗ 4 ∗ 3 ∗ 2 ∗ 1 3 ∗ 2 ∗ 1 ∗ ( 3 ∗ 2 ∗ 1 ) \frac{6*5*4*3*2*1}{3*2*1 * (3*2*1)} 3∗2∗1∗(3∗2∗1)6∗5∗4∗3∗2∗1 = 20
x = 1 4 \frac{1}{4} 41 * 20 = 5;
A:可能是2 B:不可能是2 C:一定是2 D:不可能是3
因为输出的序列是1,2,3…n , 因为输出的序列第一个是1,而且P3是1,则第一个弹出的是P3则此时的P1,P2都还在栈里面,而后第二个输出的就是2,栈里面只有P2才会在下一个位置弹出,或者P4压入以后弹出P4,所以2只会使P2或者P4。P1百分之一万是不可能是2的,所以选 “不可能是2”。
A: 2 ,4 | B: 2 , 1 | C: 4 , 3 | D: 3 , 4
假设P2是4 ,则P1会使1,2,3中任意一个
设P1是1,则P3一定是3 P4一定是2
设P1是2,则P3一定是3 P4一定是1
设P1是3,则P3一定是2 P4一定是1
P4必不可能是3所以选C
节省存储空间,降低发生上溢的可能
∵P2 = 3
∴但是P1弹出过一次,可能是1也可能是2
∴栈里剩余的一个数有可能是1也可能是2
∴P3有可能是1||2
∵后续插入的数据也可以随时弹出
∴P3也可能是后续中的任意一个数
∴P3除了不可能是3以外任何一个数都是有可能的
∴答案是 n - 1;
①,采用非递归方式重写递归程序时必须使用栈//斐波那契数列的递归程序改写成非递归程序时只需要一个循环就行了,不用栈。
②,函数调用时,系统要用栈保存必要的信息
③,只要确定了入栈顺序就能确定出栈顺序//出栈只能出栈顶元素,但是出栈可以在任何时候出栈,所以出栈的顺序有很多可能。
④,栈是一种受限的线性表,允许在其两端进行操作//栈只能在一端上操作
因为固定第一个是C第二个是D
此时栈里还有A和B
第三个可能是E也可能是B
所以有这些可能
CDEBA , CDBEA , CDBAE
总共三种
① B,C,A,E,D 是有可能的
因为A入B入B出 B
C入C出 BC
A出 BCA
D入E入E出 BCAE
D出 BCAED
②D,B,A,C,E是不可能的
A入B入C入D入D出 D
此时栈顶为C所以要出栈只能是C 或者E入E出但是不可能是B
所以这个序列是不可能的
A,IOIIOIOO B,IOOIOIIO C,IIIOIOIO D,IIIOOIOO
A 合法
B 不合法//因为出的时候为空,空栈出不了栈,所以不合法
C 不合法//因为入了五个出了三个,最后栈里面还剩有两个元素,所以栈的终态不是空栈,所以不合法
D 合法
bool solve(char s[],int len)
{
int ans = 0;
for(int i=0;i<len;i++)
{
if(s[i]=='I')ans++;
else ans--;
if(ans<0)return false;
}
if(ans) return false;//判断终态是否为空
return true;
}
思路,前一半先入栈,然后一边往后遍历一遍出栈判断是否相同。
bool solve(char s[],int len) { int midd = len/2 ; sqstack s1; init_stack(s1); int i =0; while(midd--)//先将前面的一般入栈,我这里用数组模拟单链表 { push_s(s1,s[i]); i++; } if(len%2 == 1)i++;//如果是奇数个元素,则最中间的元素不用考虑、 while(i<len)//一边出栈,一边和后面一半比较,不同就返回false。 { int x ; pop_s(s1,x); if(x == s[i])i++; else return false; } return true;//判断完了还没返回说明是回文串,所以返回true; } 时间复杂度O(n)空间复杂度O(n)
typedef struct stack{
int data[Maxsize];
int top1,top2;//top1表示左端开始,top2表示右端开始
} sqstack;
void init_stack(sqstack &s)
{
s.top= -1;
s.top2 = Maxsize;//初始化两端
}
入栈操作
bool push_s(sqstack &s , int x,int id)
{
if(id!=0&&id!=1)return false;//id = 0压左边 id = 1压右边
if(s.top1 == s.top2-1) return false;//判断是不是已经满了
if(id == 0)
{
s.data[++s.top1] = x;
}
else
s.data[--s.top2] = x;
return true;
}
出栈操作
bool pop_s(sqstack &s , int &x,int id) { if(id!=0&&id!=1)return false; //这个判空需要跟开判定 if(id == 0 ) { if(s.top1 == -1)return false; x = s.data[s.top1--]; } else { if(s.top2 == Maxsize)return false; x = s.data[s.top2++]; } return true; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。