栈的定义方式:
- 顺序栈
#define MAXSIZE 50
typedef struct{
int stack[MAXSIZE];
int top;
}SqStack;
- 链栈
typedef struct LinkNode{
int data;
struct LinkNode *next;
}*LinkStack;
- 共享栈(详见第五题)
第三题:
2)判断一个出入栈序列是否合法,I表示入,O表示出,不合法返回False,否则返回True
bool judge_legality(string str){
int cnt = 0;
for(auto i : str){
if(i == 'I') cnt ++;
else cnt --;
if(cnt < 0) return false;
}
return true;
}
第四题:
判断一个带头结点的单链表的数据是否中心对称,例如xyx、xyyx
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
bool judge(LinkList L,int n){
// 首先需要遍历前面一半的数据并存下,然后依次和后续数据逆序比较
int vis[n / 2 + 5], i; // 多开五个空间
LNode *p = L->next;
for(int i = 0;i < n / 2;i ++){
vis[i] = p->data;
p = p->next;
}
i --;
if(n % 2 == 1) p = p->next;
while(p != NULL && p->data == vis[i]){
i -- ;
p = p->next;
}
return i == -1;
}
第五题:
共享栈的定义以及相关操作
#define MAXSIZE 100; // 定义栈的最大容量
typedef struct{
int stack[MAXSIZE];
int top[2]; // 定义两个栈顶指针
}stk;
stk s;
// 注意在编写栈的操作的时候 一定注意“入栈判满,出栈判空”
// 入栈操作
// i 表示栈号,0表示下栈 1表示上栈
int push(int i,int x){
if(i < 0 || i > 1) return 0; // 栈号不对
if(s.top[1] - s.top[0] == 1) return 0; // 栈满
switch(i){
case 0: s.stack[++s.top[0]] = x, return 1;
case 1: s.stack[--s.top[1]] = x, return 1;
}
}
int pop(int i){
if(i < 0 || i > 1) return 0;
if(i == 0){
if(s.top[0] == -1) return 0;
else s.top[0] -- ;
}else{
if(s.top[1] == MAXSIZE) return 0;
else s.top[1] ++;
}
}