這裡蒐索程式師資訊,查找有用的技術資料
当前位置:首页 » 编程语言 » 求c语言中顺序栈的长度
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

求c语言中顺序栈的长度

发布时间: 2023-04-24 21:03:02

‘壹’ 用c语言编写函数实现顺序栈的进栈、退栈、取栈顶的算法。

#include<stdio.h>
#define stacksize 100 //假定预分配的栈空间最多为100 个元素
typedef char elementtype; //假定栈元素的数据类型为字符 ,在此处可以自行设置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
// 置空栈
void initstack(seqstack *s)
{
s->top=-1;
//解释一下,s->top 指向的是当前栈顶元素的位置
//当要向栈中添加一个新元素时,要先将s->top增加1,
//此时s->top 指向的就是新元素要添加的位置了。
//所以当栈为空时,填加第一元素时,top加1 后
//s->top的值就变为0,也就是第一个元素的位置了。
}
//判栈空
int stackempty(seqstack *s)
{
if(s->top==-1)
return 1; //若相等就返回1,否则为0
else return 0;
}
//入栈
void push(seqstack *s,elementtype x)
{
if(s->top==stacksize -1 ) //进栈前判断栈是否已经满了
printf(" stack overflow\n");
else
{
s->top= s->top + 1;
s->data[s->top]=x;
}
}
//出栈
elementtype pop(seqstack *s)
{
if(stackempty(s)) //出栈前先判断当前栈中是否有内容
printf("stack is empty\n");
else
{
return s->data[s->top--]; //出栈后s->top的值会自减1
}
}
//取栈顶元素(只是想知道栈顶的值,并没有出栈)
elementtype gettop(seqstack *s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack *s; //定义一个栈,用指针的方式定义的
initstack(s); //想初始化定义好的栈
//当栈为空时调用出栈操作
pop(s);

//向栈中添加一个元素a
push(s,'a');

//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);

//再添加一个元素b
push(s,'b');

//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);

//弹出栈顶的元素
x=pop(s);
printf("%c\n",x);

//观察弹出后栈顶元素的变化情况
x=gettop(s);
printf("%c\n",x);
return 0;
}

‘贰’ 用c语言描述顺序存储结构的线性表求表长的算法

#include<stdio.h>
#include<stdlib.h>
#define list_init_size 5
#define listincrement 10
#define overflow -2
typedef int status;
typedef int elemtype;
typedef struct
{
elemtype *elem;
int length;
int listsize;
} sqlist;
status initlist_sq(sqlist &L)
{
L.elem=(elemtype *)malloc(list_init_size * sizeof(elemtype));
if(!L.elem) exit(overflow);
L.length=0;
L.listsize=list_init_size;
return 1;
}

将顺序表初始化为5个元素,在结构中定义了顺序表的长度,int length:所以在主函数中可以直接调用用printf("%d",L.length)就得到了当前的长度,无论是删除,添加,L.length都会随着改变,比如我们建一个添加的函数

status listinsert_sq(sqlist &L, int i ,elemtype e)
{
int * q , *p ,* newbase;
if(i<1 || i>L.length + 1) return 0;
if(L.length >= L.listsize)
{
newbase=(elemtype *)realloc(L.elem,(L.listsize+listincrement) * sizeof(elemtype));
if(!newbase) exit (overflow);
L.elem=newbase;
L.listsize+=listincrement;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]) ;p>=q ;--p)
*(p+1) = *p;
*q = e;
++L.length;
return 1;
}
如果加一个元素,就会把L.length自动加1,这样避免了再写函数求表长

‘叁’ C++: 编写一个顺序栈,要有顺序栈的类型判空操作,清空操作与求栈长操作,入栈操作,出栈操作。

#include<iostream>
#include<malloc.h>

usingnamespacestd;

#defineSTACK_INIT_SIZE100
#defineSTACK_SPACE_INCR20
#defineTRUE1
#defineFALSE0

typedefintSElemType;
typedefintStatus;

structSqStack
{
SElemType*base;
inttop;
intstackSize;
};

StatusInitStack(SqStack&S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
returnFALSE;
}
S.top=0;
S.stackSize=STACK_INIT_SIZE;
returnTRUE;
}

StatusStackIsEmpty(SqStackS)
{
if(!S.top)
returnTRUE;
else
returnFALSE;
}

voidClearStack(SqStack&S)
{
if(S.base)
free(S.base);
S.top=0;
S.stackSize=0;
}

intStackLength(SqStackS)
{
returnS.top;
}

voidPrintStack(SqStackS)
{
inti;
cout<<"栈长度为"<<StackLength(S)<<",栈中数据如下:"<<endl;
for(i=0;i<S.top;i++)
{
cout<<S.base[i]<<"";
}
cout<<endl;
}

StatusPush(SqStack&S,SElemTypee)
{
if(S.top==S.stackSize)
{
//栈空间已满,重新获取空间
S.base=(SElemType*)realloc(S.base,(S.stackSize+STACK_SPACE_INCR)*sizeof(SElemType));
if(!S.base)
衫亮拍{
returnFALSE;
}
S.stackSize+=STACK_SPACE_INCR;
}
S.base[S.top]=e;
S.top++;
returnTRUE;
}

StatusPop(SqStack&S,SElemType&e)
{
if(TRUE==StackIsEmpty(S))
{
returnFALSE;
}
S.top--;
e=S.base[S.top];
returnTRUE;
}

StatusInitStackInput(SqStack&S)
{
SElemTypen;
cout<<"请输入数据,以-1结束:"<<endl;
while(1)
{
cin>>n;
if(n==-1)
break;
Push(S,n);
}
returnTRUE;
}

intmain()
{
intm;
SElemTypee;
SqStacks;
InitStack(s);
或羡do
{
cout<<endl;
cout<<"所有操作如下:"<<endl;
cout<<"1.采用顺序存储实现栈的初始化操作"<<endl;
cout<<"2.采用顺序存储实现栈的入栈操作"<<endl;
cout<<"3.采用顺序存储实现栈的出栈操作"<<endl;
cout<<"4.打印栈中所有数据"<<endl;
cout<<"-1.退出"<<endl;
cout<<"请选择:"<<endl;
cin>>m;

switch(m)
{
case1:
InitStackInput(s);
break;
case2:
cout<<"输入入栈的数据:"<<endl;
cin>>e;
Push(s,e);
break;
case3:
if(TRUE==Pop(s,e))
cout<<"出栈的数据为:"<<e<<endl;
键纯else
cout<<"出栈失败"<<endl;
break;
case4:
PrintStack(s);
break;
case-1:
break;
default:
cout<<"没有该选项!"<<endl;
break;
}
}while(m!=-1);

ClearStack(s);
return0;
}

g++编译通过, 编写了main函数以测试出入栈的功能, 运行结果正确

望采纳, 谢谢~

‘肆’ 数据结构中计算栈的长度的函数看不懂

是顺序栈和衫吧?你这个栈的结构体定义应该贴出来。
s[0 ]
s[1 ]
s[2 ]
s[3 ]

比如p首先指唤卖腔向是s[0],p=s.top。
然后p开始往下挪动,一直到p等于s.base为止。

p++不是往上的,是往下的.....比如在数组里&a[0]=p;p++;之后p就指向a[1]了。
栈顶在上,栈底在下,s.base应该相当于我的配埋s[3]位置。

‘伍’ C语言怎么求顺序栈长度

这是昌卖带指针相减的特性,指针相减就是两个之耐芦间的元素个数。
(unsigned int)S->top - (配雀unsigned int)S->base; // 要得到实际的地址值相减强制转换成整数就行了

‘陆’ c语言顺序栈问题

for(i = s->top; i>=0; i--) { //遍历栈
printf("%d->",s->data);
}
这里data你定义的是数组名所以
printf("%d->",s->data[i]);
求判并老采纳,蔽贺求经验,求悬掘升赏

‘柒’ 给定元素入栈顺序和出栈顺序,编写计算栈最短长度的代码.例如:入栈序列1 2 3 4,出栈序列2 3 1 4

push 1--1
push 2--2
pop 2--1
push 3--2
pop 3--1
pop 1--0
push 4--1
pop 4--0

此时栈的答燃最短长度(上面右扒举慧边数字最大者)春答为 2

‘捌’ 急求c语言关于堆栈的长度

找本数据结构书,都是最简单的例程代码,真的懒得敲一遍了

‘玖’ c语言 栈的操作

#include
#include

#define Max 100

typedef char T;

typedef struct MyStack
{
T aa[Max];
unsigned int p;

} stack;

//创建空栈
stack* createEmptyStack()
{
stack* st = (stack *)malloc(sizeof(stack));
int i=0;
for(i=0;i<Max;i++)
st->aa[i]=0;
st->p=0;
return st;
};

//栈判空
int isEmpty(const stack* st)
{
if(st->p==0) return 1;
else return 0;
};

//求栈的大小
unsigned int size(const stack* st)
{
return st->p;
};

//push操作
void push(stack* st,const T a)
{
st->p=st->p+1;
if(st->p==Max)
{
printf("栈满\n");
st->p--;
return;
}
st->aa[st->p]=a;
};

//pop操作
T pop(stack* st)
{
if(isEmpty(st))
{
printf("栈空");
return NULL;
}
char t=st->aa[st->p];
st->p=st->p-1;
printf("%c ",t);
return t;
};

//栈销毁
void destroy(stack* st)
{
free(st);
};

int main()
{

stack* st = createEmptyStack();
if(isEmpty(st)) printf("MyStack is empty\n");
else printf("MyStack is not empty\n");
push(st,'a');
push(st,'b');
push(st,'c');
push(st,'d');
push(st,'e');
printf("%d\n",size(st));
while(!isEmpty(st)) pop(st);
destroy(st);
system("pause");
return 0;
}

‘拾’ c语言数据结构高手请进,关于顺序栈的基本操作问题。

1. 想通过调用函数改变某个变量的值,必须传递这个变量的地址。也就是在InitStack中申请的内存并没有赋给Main中的s变量,会导致后面的访问出错。改为引用就可以了:
void InitStack(SqStack* &s)//初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}

2.在"Pop(s,e);", 这个e并没有内存,导致"*e=s->data[s->top];"出错。
需要给它申请内存:
ElemType *e = (ElemType*)malloc(sizeof(ElemType));
最后"free(e);"一下。