建立含有若干个元素的顺序栈 对已建立的顺序栈实现插入,删除,取栈顶元素操作!求帮助啊
1个回答
展开全部
分有点少。
/*顺序栈C语言
* 建立含有若干个元素的顺序栈 对已建立的顺序栈实现插入,删除,取栈顶元素操作
*/
#include<stdio.h>
#include<stdlib.h>
#include<LIMITS.H>
//元素类型
typedef int elem_type;
//栈结构定义
typedef struct {
elem_type *e,*top;
int len;
int capacity;
}Stack;
//创建容量为maxlen的顺序栈
Stack* Build(int maxlen)
{
if(maxlen<0 || maxlen>INT_MAX) return NULL;
Stack *s = (Stack *)calloc(1, sizeof(Stack)); //初始化成员都为0
if(s)
{
s->e=(elem_type*)calloc(maxlen, sizeof(elem_type));//初始化数据都为0
if(s->e) s->capacity = maxlen;
else s->capacity =0;
s->top = s->e;
}
return s;
}
//判断栈空
bool Empty(Stack *s)
{
if(!s)
return true;
else
return s->len==0;
}
//判断栈满
bool Full(Stack *s)
{
if(!s) return true;
return s->len == s->capacity;
}
//栈s的位置pos上插入元素a
bool Insert(Stack* s, elem_type a, int pos)
{
if(!s) return false;
if(s->len == s->capacity) //栈满,不能插入
return false;
if(pos<0||pos>s->len) //位置不合法
return false;
int x; //x为数组下标索引
if(s->len==0){ //原来为空,则忽略pos,直接插入
s->e[s->len++]=a;
s->top ++;
return true;
}
else
{
x = ++s->len ; //栈长增加一
s->top = s->e + s->len; //更新新的栈顶
while(x>pos)
{
s->e[x] = s->e[x-1];
x--;
}
s->e[pos] = a;
return true;
}
return false;
}
//删除栈s指定位置pos处存放的元素,存到x指向的内存
bool Del(Stack *s, int pos, elem_type*x)
{
if(Empty(s)) return false;
if(pos>s->len-1 || pos < 0 ) return false;
//删除操作
*x=s->e[pos];
int i=pos;
while(i<s->len-1)
{
s->e[i] = s->e[i+1];
i++;
}
//更新栈长及栈顶指针
s->len--;
s->top--;
return true;
}
//查看栈顶.栈非空才能调用
elem_type Top(Stack *s)
{
return *(s->top-1);
}
//弹出栈顶
bool Pop(Stack *s, elem_type *x)
{
if(!s || s->e==s->top) //为空栈
return false;
else
{
*x = *(--s->top);
return true;
}
}
//压栈
void Push(Stack *s, elem_type x)
{
if(Full(s)) return;
*(s->top++) = x;
s->len++;
}
//清空栈
void Clear(Stack *s)
{
if(s->e) free(s->e);
s->len=0;
s->e = s->top = NULL;
}
int main()
{
int a[10]={1,5,4,3,2,6,8,9,0,7};
Stack *s=Build(100);
if(s==NULL){
printf("创建栈失败,可能内存空间不够!\n");
return (-1);
}
//测试插入
for (int i=0;i<10;i++)
{
Insert(s,a[i],0);
}
int x;
printf("依次删除栈底元素:\n");
//测试删除
for (i=0;i<10;i++)
{
Del(s,0,&x);
printf("%d\n",x);
}
//测试压栈
for (i=0;0&&i<10;i++)
{
Push(s,a[i]);
}
printf("重新压栈后弹出栈顶元素:\n");
//测试弹出
for (i=0;i<10;i++)
{
if(Pop(s,&x))
printf("%d\n", x);
}
//清空栈元素所占内促空间
Clear(s);
//清空栈本身所占空间
free(s);
return 0;
}
追问
编译不行啊
追答
我在VC6下可编译,测试正确的版本。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询