c语言双向栈满栈的条件,2019考研数据结构C语言版详解答案:栈和队列(8)

《数据结构(C语言版)》考试内容两大类:概念,算法。自从计算机专业课统考以后,专业课考试题型分为2类,一类选择题,一类综合应用题。要想把数据结构这门专业课复习好,除了做练习题,还要掌握2019考研计算机数据结构(C语言版)基础知识,只有基础知识掌握牢固,才能在做数据结构算法题目时得心应手。本次新东方在线整理了数据结构C语言版答案详解,各位考生可以对照着题目与答案详解,把计算机专业课的数据结构复习一遍。

3.15

假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。

解:

class DStack{

ElemType *top[2];

ElemType *p;

int stacksize;

int di;

public:

DStack(int m)

{

p=new ElemType[m];

if(!p) exit(OVERFLOW);

top[0]=p+m/2;

top[1]=top[0];

stacksize=m;

}

~DStack(){delete p;}

void Push(int i,ElemType x)

{

di=i;

if(di==0){

if(top[0]>=p) *top[0]--=x;

else cerr<

}

else{

if(top[1]

else cerr<

}

}

ElemType Pop(int i)

{

di=i;

if(di==0){

if(top[0]

else cerr<

}else{

if(top[1]>top[0]) return *top[1]--;

else cerr<

}

return OK;

}

};

// 链栈的数据结构及方法的定义

typedef struct NodeType{

ElemType data;

NodeType *next;

}NodeType,*LinkType;

typedef struct{

LinkType top;

int size;

}Stack;

void InitStack(Stack &s)

{

s.top=NULL;

s.size=0;

}

void DestroyStack(Stack &s)

{

LinkType p;

while(s.top){

p=s.top;

s.top=p->next;

delete p;

s.size--;

}

}

void ClearStack(Stack &s)

{

LinkType p;

while(s.top){

p=s.top;

s.top=p->next;

delete p;

s.size--;

}

}

int StackLength(Stack s)

{

return s.size;

}

Status StackEmpty(Stack s)

{

if(s.size==0) return TRUE;

else return FALSE;

}

Status GetTop(Stack s,ElemType &e)

{

if(!s.top) return ERROR;

else{

e=s.top->data;

return OK;

}

}

Status Push(Stack &s,ElemType e)

{

LinkType p;

p=new NodeType;

if(!p) exit(OVERFLOW);

p->next=s.top;

s.top=p;

p->data=e;

s.size++;

return OK;

}

Status Pop(Stack &s,ElemType &e)

{

LinkType p;

if(s.top){

e=s.top->data;

p=s.top;

s.top=p->next;

delete p;

s.size--;

}

return OK;

}

// 从栈顶到栈底用Visit()函数遍历栈中每个数据元素

void StackTraverse(Stack s,Status (*Visit)(ElemType e))

{

LinkType p;

p=s.top;

while(p) Visit(p->data);

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值