顺序栈,共享栈和结构体中“.”与“

您所在的位置:网站首页 top和topping的区别 顺序栈,共享栈和结构体中“.”与“

顺序栈,共享栈和结构体中“.”与“

#顺序栈,共享栈和结构体中“.”与“| 来源: 网络整理| 查看: 265

1.top指向栈顶元素,令S.top = -1。

(1)初始化

//初始化 void InitStack(SqStack *S) { S->top = -1; }

(2)判断栈是否为空

//判断栈是否为空 bool StackEmpty(SqStack *S) { if(S->top == -1) return true; else return false; }

(3)进栈

//进栈 bool Push(SqStack *S,int x) { if(S->top == Maxsize-1)//栈满,报错 return false; S->data[++S->top] = x;//指针先加1,再入栈 return true; }

(4)出栈

//出栈 bool Pop(SqStack *S,int &x) { if(S->top == -1)//栈空,报错 return false; x = S->data[S->top--];//先出栈,指针再减1 return true; }

(5)读栈顶元素

//读栈顶元素 int GetTop(SqStack *S,int &x) { if(S->top == -1) return 0; else { x = S->data[S->top]; return x; } }

(6)遍历输出

//遍历输出 bool Traverse(SqStack *S) { int i = S->top; if(StackEmpty(S)) { printf("栈为空!"); return false; } else { while(i != -1) { printf("%d\n",S->data[i--]); } return true; } }

运行结果

2.栈顶指针初始化为S.top=0,即top指向栈中下一个可以插入元素的位置

(1)初始化

//初始化 void InitStack(SqStack *S) { S->top = 0;//初始化 }

 (2)判断栈是否为空

//判断栈是否为空 bool StackEmpty(SqStack *S) { if(S->top == 0)//当为0时栈为空 return true; else return false; }

(3)进栈

//进栈 bool Push(SqStack *S,int x) { if(S->top == Maxsize+1)//栈满,报错 return false; S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11 return true; }

(4)出栈

//出栈 bool Pop(SqStack *S,int &x) { if(S->top == 0)//栈空,报错 return false; x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0 return true; }

(5)读栈顶元素

//读栈顶元素 int GetTop(SqStack *S,int &x) { if(S->top == 0) return 0; else { x = S->data[S->top]; return x; } }

运行结果

前两个对比,++S->top表示的是先加1然后再运行S->data[] ;S->top++表示的是先运行S->data[]然后S->top再加1.

3.共享栈

利用栈底元素相对位置不变的特性,可以让顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。两个栈的栈顶指针都是指向栈顶元素,假设top0=-1时为top0那边栈为空,top1=maxsize为top1那边栈为空;仅当两个指针相邻(top1-top0=1)时,判断栈满。top0先加1再赋值,top1先减1再赋值;相当于top0指向小的那边,top1指向栈大的那边

(1)初始化

void InitStack(SqStack &S) { S.top0 = -1; S.top1 = maxsize; }

(2)判断栈是否为空

bool StackEmpty(SqStack &S) { if(S.top0 == -1 || S.top1 == maxsize) return true; else return false; }

(3)进栈

bool Push(SqStack &S, int x,int y) { if(S.top1 - S.top0 == 1) return false; else { S.data[++S.top0] = x; S.data[--S.top1] = y; } return true; }

(4)出栈

bool Pop(SqStack &S,int &x,int &y) { if(S.top0 != -1 || S.top1 != maxsize ) return false; else { x = S.data[S.top0--]; y = S.data[++S.top1]; } return true; }

(5)读栈顶元素

因为C++里面不可以同时返回两个值,所以可以通过结构体来达成,并且不要弄成指针类型,例如val->a这样是无法输出出去,会出错 return_X_Y Get(SqStack &S,int &x,int &y) { struct return_X_Y val; if(S.top0 != -1) val.a = S.data[S.top0]; if(S.top1 != maxsize) val.b= S.data[S.top1]; return val; }

(6)遍历输出

void traverse(SqStack &S) { if(S.top0 == -1 || S.top1 == maxsize) { printf("栈为空!\n"); return; } if(S.top0 == -1) printf("top0那边为空\n"); if(S.top1 == maxsize) printf("top1那边为空\n"); int i = S.top0; int j = S.top1; printf("top0那边元素为:\n"); while(i != -1) { printf("%d\n",S.data[i--]); } printf("top1那边元素为:\n"); while(j != maxsize) { printf("%d\n",S.data[j++]); } return; }

运行结果

结构体中“.”与“->”的区别

1、A->a表示A是指向结构体的指针

2、A.a表示A是结构体

3、A->a等效于(*A).a

4、A.B则A为对象或者结构体

5、A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;

可以通过顺序栈和共享栈进行比较“.”与“->”的用法

顺序栈中使用的是"->"如果将其换成”.“,然后将S前的”*“换成"&",然后将main函数中的&去掉也会运行成功,以此来体验结构体中”.“与”->“的差别

全部代码

顺序表

//本次代码数据域以整数型为主 #include #define Maxsize 10 typedef struct { int data[Maxsize]; int top; }SqStack; //函数说明 void InitStack(SqStack *S);//初始化 bool StackEmpty(SqStack *S);//判断栈是否为空 bool Push(SqStack *S,int x);//进栈 bool Pop(SqStack *S,int &x);//出栈 int GetTop(SqStack *S,int &x);//读取栈顶元素 bool Traverse(SqStack *S);//遍历输出 int main(void) { SqStack S; int x; InitStack(&S); Push(&S,1); Push(&S,2); Push(&S,3); Push(&S,4); Push(&S,5); Push(&S,6); Push(&S,7); Push(&S,8); Push(&S,9); Push(&S,10); Traverse(&S); int val = GetTop(&S,x); printf("栈顶元素为:%d\n",val); Pop(&S,x); printf("出栈之后栈中元素为:\n"); Traverse(&S); return 0; } /*//top指的是栈顶元素 //初始化 void InitStack(SqStack *S) { S->top = -1; } //判断栈是否为空 bool StackEmpty(SqStack *S) { if(S->top == -1) return true; else return false; } //进栈 bool Push(SqStack *S,int x) { if(S->top == Maxsize-1)//栈满,报错 return false; S->data[++S->top] = x;//指针先加1,再入栈 return true; } //出栈 bool Pop(SqStack *S,int &x) { if(S->top == -1)//栈空,报错 return false; x = S->data[S->top--];//先出栈,指针再减1 return true; } //读栈顶元素 int GetTop(SqStack *S,int &x) { if(S->top == -1) return 0; else { x = S->data[S->top]; return x; } } //遍历输出 bool Traverse(SqStack *S) { int i = S->top; if(StackEmpty(S)) { printf("栈为空!"); return false; } else { while(i != -1) { printf("%d\n",S->data[i--]); } return true; } } */ //top指向栈顶元素的下一个位置 //初始化 void InitStack(SqStack *S) { S->top = 0;//初始化 } //判断栈是否为空 bool StackEmpty(SqStack *S) { if(S->top == 0)//当为0时栈为空 return true; else return false; } //进栈 bool Push(SqStack *S,int x) { if(S->top == Maxsize+1)//栈满,报错 return false; S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11 return true; } //出栈 bool Pop(SqStack *S,int &x) { if(S->top == 0)//栈空,报错 return false; x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0 return true; } //读栈顶元素 int GetTop(SqStack *S,int &x) { if(S->top == 0) return 0; else { x = S->data[S->top]; return x; } } //遍历输出 bool Traverse(SqStack *S) { int i = S->top; if(StackEmpty(S)) { printf("栈为空!"); return false; } else { while(i != 0) { printf("%d\n",S->data[--i]); } return true; } }

共享栈

#include #define maxsize 15 typedef struct { int data[maxsize]; int top0; int top1; }SqStack; struct return_X_Y { int a; int b; }; //函数说明 void InitStack(SqStack &S); bool StackEmpty(SqStack &S); bool Push(SqStack &S, int x,int y); bool Pop(SqStack &S,int &x,int &y); return_X_Y Get(SqStack &S,int &x,int &y); void traverse(SqStack &S); int main(void) { SqStack S; int x,y; InitStack(S); Push(S,1,-1); Push(S,2,-2); Push(S,3,-3); Push(S,4,-4); Push(S,5,-5); Push(S,6,-6); Push(S,7,-7); traverse(S); struct return_X_Y pVal = Get(S,x,y); printf("top0,top1两边栈顶元素分别为:%d,%d\n",pVal.a,pVal.b); Pop(S,x,y); printf("删除元素之后栈中元素为:\n"); traverse(S); return 0; } void InitStack(SqStack &S) { S.top0 = -1; S.top1 = maxsize; } bool StackEmpty(SqStack &S) { if(S.top0 == -1 || S.top1 == maxsize) return true; else return false; } bool Push(SqStack &S, int x,int y) { if(S.top1 - S.top0 == 1) return false; else { S.data[++S.top0] = x; S.data[--S.top1] = y; } return true; } bool Pop(SqStack &S,int &x,int &y) { if(S.top0 != -1 || S.top1 != maxsize ) return false; else { x = S.data[S.top0--]; y = S.data[++S.top1]; } return true; } return_X_Y Get(SqStack &S,int &x,int &y) { struct return_X_Y val; if(S.top0 != -1) val.a = S.data[S.top0]; if(S.top1 != maxsize) val.b= S.data[S.top1]; return val; } void traverse(SqStack &S) { if(S.top0 == -1 || S.top1 == maxsize) { printf("栈为空!\n"); return; } if(S.top0 == -1) printf("top0那边为空\n"); if(S.top1 == maxsize) printf("top1那边为空\n"); int i = S.top0; int j = S.top1; printf("top0那边元素为:\n"); while(i != -1) { printf("%d\n",S.data[i--]); } printf("top1那边元素为:\n"); while(j != maxsize) { printf("%d\n",S.data[j++]); } return; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3