数据结构算法经常看到的形如"int InitStack(Stack &S)"和"int Empty(Stack S)"的解释

   本文由江伟原创,如要转载请注明出处,谢谢!

  

  在很多算法中我们经常看到形如"int InitStack(Stack &S)"和"int Empty(Stack S)"的两种形式,即有"&"和没有"&"两种。相信很多人还没弄清楚这是怎么回事。其实这是函数传参的两种形式—按值传递按址传递

  

  我们都知道以前学c++时一个经典例子用来解释这两种传参方式的区别,就是调换两个变量a和b的值的swap函数。当函数是"swap(a,b)"时,调用该函数后,函数操作的其实只是a和b的副本(按值传递会先建立参数的拷贝),a和b的值其实并没变,当用swap(&a,&b)时,因为调用该函数时操作的是地所指的那块内存区域,函数调用结束后a和b当然也变了。同理,"int InitStack(Stack &S)"是初始化栈,S被改变了,要返回到主函数中,所以要用按址传递;而"int Empty(Stack S)"只是判断S是否为空,并没改变S的内容,所以不用按址传递。


  因此,在数据结构的那些函数中有的有"&",有的没"&",也就不奇怪了。

  还有,有的函数传递参数可以按值传递,但是由于要先建立参数的拷贝,这样会耗费时间和空间等资源,所以用按址传递更好。除了用取地址符&,也可以用指针的方式也就是"int InitStack(Stack *S)"。


  最后,比如初始化栈这个函数如果不用"InitStack(Stack &S)",而用"InitStack(Stack S)"也行,只不过函数体最后要加上"return S;",并且将函数返回值类型改为"Stack",即"Stack InitStack(Stack S)",但是如果遇到"int Pop(Stack &S,SElemType &e)"这样要返回两个值的,不好用这种方法了。而且感觉这样有点多此一举。。。。。

  • 26
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
#include <stdio.h> #include<iostream> #include<stdlib.h> #include<stdio.h> #define MAXSIZE 20 using namespace std; struct BiTreeNode//二叉树结点定义 { BiTreeNode* LChild;//左孩子指针域 int data; BiTreeNode* RChild;//右孩子指针域 }; struct Stack//栈的定义 { int base;//栈底指针 int top;//栈顶指针 BiTreeNode BTNS[MAXSIZE];//二叉树结点数组 int stackSize;//栈可用的最大容量 }; void InitStack(Stack*& S)//初始化栈 { S = (Stack*)malloc(sizeof(Stack)); S->top = S->base = 0; S->stackSize = MAXSIZE; } bool StackEmpty(Stack*& S)//判断栈是否为空 { if (S->base == S->top) { return true; } else { return false; } } bool StackFull(Stack*& S)//判断栈是否已满 { if (S->top - S->base == S->stackSize) { //栈已满 return true; } else { //栈不满 return false; } } void Push(Stack*& S, BiTreeNode*& T)//元素入栈 { if (StackFull(S) == true) { //如果栈已满, 则直接返回 return; } S->BTNS[S->top].data = T->data; S->BTNS[S->top].LChild = T->LChild; S->BTNS[S->top].RChild = T->RChild; S->top++; } BiTreeNode* Pop(Stack*& S)//元素出栈 { if (StackEmpty(S) == true) { return NULL; } S->top--; return &(S->BTNS[S->top]); } // void CreateBiTree(BiTreeNode*& T)//以先序序列创建二叉树 { char ch; cin >> ch; if (ch != '#') { T = (BiTreeNode*)malloc(sizeof(BiTreeNode)); T->data = ch; CreateBiTree(T->LChild); CreateBiTree(T->RChild); } else { T = NULL; } } void InOrderTraverse(Stack*& S, BiTreeNode*& T)//中序遍历二叉树的非递归算法(※) { InitStack(S);//初始化栈 BiTreeNode* p = T; BiTreeNode* q; while (p || !StackEmpty(S)) { if (p) { Push(S, p); p = p->LChild; } else { q = Pop(S);//出栈元素指针保存在q中 putchar(q->data); cout << " "; p = q->RChild; } } } int main() { Stack* S; BiTreeNode* T; CreateBiTree(T); InOrderTraverse(S, T); return 0; }请帮我把代码优化一下
06-08
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘_博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值