顺序栈的结构体
//顺序栈
typedef struct{
int data[MAXSIZE];
int top;
} SqStack;
常用操作:
//初始化顺序栈
void InitStack(SqStack &s){
s.top = -1;
}
//判断栈空
bool StackEmpty(SqStack s){
if(s.top == -1)return true;
else return false;
}
//进栈
void Push(SqStack &s,int x){
if(s.top == MAXSIZE-1){
printf("栈已满!");
}else{
s.data[++s.top] = x;
}
}
//出栈
void Pop(SqStack &s,int &x){
if(s.top == -1){
printf("栈为空!");
}else{
x = s.data[s.top--];
};
}
//拉取栈顶元素
void GetTop(SqStack s,int &x){
if(s.top == -1){
printf("栈为空!");
}else{
x = s.data[s.top];
};
}
链栈结构体:
//链栈
typedef struct Linknode{
int data;
struct Linknode *next;
} *LiStack;
链栈常用操作:
//初始化链栈
void InitLS(LiStack &s){
s = (LiStack)malloc(sizeof(Linknode));
//在这里考虑头节点值为负,您也可以自行更改规则
s->data = -1;
s->next = NULL;
}
//判断链栈是否为空
bool LSEmpty(LiStack s){
if(s->next==NULL)return true;
else return false;
}
//链栈入栈
void LSPush(LiStack &s,int x){
LiStack l = (LiStack)malloc(sizeof(Linknode));
//前插法
l->data = x;
l->next = s->next;
s->next = l;
}
//链栈出栈
void LSPop(LiStack &s,int &x){
if(s->next==NULL){
printf("栈为空!");
}else{
LiStack u = s->next;
x = u->data;
s->next = u->next;
free(u);
}
}
//链栈获取第一个元素
void LSGetTop(LiStack s,int &x){
if(s->next==NULL){
printf("栈为空!");
}else{
x = s->next->data;
}
}
//销毁链栈
void DestoryLS(LiStack &s){
LiStack u = s->next,pre = s,r;
while(u){
r = u;
pre->next = u->next;
u = u->next;
free(r);
}
free(s);
}
共享栈结构体:
//共享栈
typedef struct{
int data[MAXSIZE];
int top[2];
} ShareStack;
共享栈常用操作:
//初始化共享栈
void InitSStack(ShareStack &s){
s.top[0] = -1;
s.top[1] = MAXSIZE;
}
//判断共享栈为空
//参数 1,共享栈 2,选取的哪个栈 1号还是2号 ?
bool SSEmpty(ShareStack s,int i){
if(i==1){
if(s.top[0] == -1)return true;
else return false;
}else if(i==2){
if(s.top[1] == MAXSIZE)return true;
else return false;
}else{
printf("栈号有误!");
return false;
}
}
//进栈
//参数 1,共享栈 2,选取的哪个栈 1号还是2号 ? 3,传入的参数
void SSPush(ShareStack &s,int i,int x){
if(i==1){
if(s.top[1]-s.top[0]==1){
printf("栈已满!");
}else{
s.data[++s.top[0]] = x;
}
}else if(i==2){
if(s.top[1]-s.top[0]==1){
printf("栈已满!");
}else{
s.data[--s.top[1]] = x;
}
}else{
printf("栈号有误!");
}
}
//出栈
//参数 1,共享栈 2,选取的哪个栈 1号还是2号 ? 3,传入的参数
void SSPop(ShareStack &s,int i,int &x){
if(i==1){
if(s.top[0]==-1){
printf("栈为空!");
}else{
x = s.data[s.top[0]--];
}
}else if(i==2){
if(s.top[1]==MAXSIZE){
printf("栈为空!");
}else{
x = s.data[s.top[1]++];
}
}else{
printf("栈号有误!");
}
}
//拉取栈顶元素
void GetSSTop(ShareStack s,int i,int &x){
if(i==1){
if(s.top[0]==-1){
printf("栈为空!");
}else{
x = s.data[s.top[0]];
}
}else if(i==2){
if(s.top[1]==MAXSIZE){
printf("栈为空!");
}else{
x = s.data[s.top[1]];
}
}else{
printf("栈号有误!");
}
}
小试牛刀(应用栈):
题目:设单链表的表头指针为L , 结点结构由data 和next 两个域构成, 其中data 域为字符型。
试设计算法判断该链表的全部n 个字符是否中心对称· 例如xyx 、XYYX 都是中心对称
思路:将链表压入栈内,再利用栈后进先出的特性对2元素比对
代码:
//判断链表是否对称
bool checksym(LinkList &l){
//初始化链表
LinkList p = l;
//定义链表长度 遍历长度 暂存变量
int length = 0,k = 0,x=0;
//新建栈
SqStack s;
//栈初始化
InitStack(s);
//遍历链表
while(p){
//压入栈
Push(s,p->data);
//链表后移
p = p->next;
//长度加加
length++;
}
//p等于l,重新遍历链表
p = l;
//遍历检查值是否相等
while(p && k< (length/2)){
//弹出栈
Pop(s,x);
//不等返回假
if(p->data!=x) return false;
//p后移
p = p->next;
//k加加
k++;
}
//遍历检查完成,返回真
return true;
}
题目:递归求解字符串长度
int strlen(char *str1)
{
//终止条件
if (*str1 != '\0')
{
str1++;
return 1 + strlen(str1);
}
else{
return 0;
}
}
题目:实现二分查找递归法
int Search(int[] arr,int left,int right,int fVal) {
//递归的终止条件之:找不到该元素
if(left > right) {
return -1;
}
//没有查找完该序列的时候
int mid = (left + right)/2;
int midVal = arr[mid];
//判断midVal与findVal的大小关系
if(fVal > midVal) {
//fVal > midVal,则进行向右递归,查找fVal;
return binarySearch(arr, mid+1, right, fVal);
}else if(fVal < midVal) {
//fVal < midVal,则进行向左递归,查找fVal;
return binarySearch(arr, left, mid-1, fVal);
}else {
//fVal == midVal,则表明找到了fVal,直接返回下标值;
return mid;
}
}
以上代码仅供参考,如有错误恳请指正,谢谢!