#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#define stackinit 100
#define stackincre 10
#define overflow -2
typedef int Selemtype;
typedef struct {
Selemtype *base;
Selemtype *top;
int stacksize;
} seqstack;
int initstack(seqstack &s) //构造一个空栈
{
s.base=(Selemtype*)malloc(sizeof(Selemtype)*stackinit);
if (!s.base)
return 0; //存储分配失败
s.top=s.base;
s.stacksize=stackinit;
return 1;
}
int destroystack(seqstack &s) //销毁栈s,s不再存在
{
if (s.base)
free(s.base);
return 1;
}
int clearstack(seqstack &s) //将s置为空栈
{
s.top=s.base;
return 1;
}
int stackempty(seqstack s) //若栈s为空栈,则返回1,否则返回0
{
return s.top==s.base;
}
int stacklength(seqstack &s) //返回s的元素个数,即栈的长度
{
return s.top-s.base;
}
int gettop(seqstack s,Selemtype &e) //若栈不空,则用e返回s的栈顶元素,否则返回0
{
if (s.top==s.base)
return 0;
e=*(s.top-1);
return e;
}
int push(seqstack &s,Selemtype e) //插入元素e为新的栈顶元素
{
if (s.top-s.base >= stackinit){ //栈满,追加存储空间
s.base = (Selemtype*)realloc(s.base , (s.stacksize+stackincre)*sizeof(Selemtype));
if(!s.base) //存储分配失败
exit(overflow);
s.top= s.base + s.stacksize;
s.stacksize += stackincre;
}
*(s.top++) = e;
return 1;
}
int pop(seqstack &s,Selemtype &e) //若栈不空,则删除s的栈顶元素,用e返回其值,并返回1;否者返回0
{ //是不是和前面的gettop函数有点像
if (s.top==s.base)
return 0;
e=*(--s.top); //区别在这
return 1;
}
int Print(int t) {
printf (" %d", t);
return 1;
}
int stacktraverse(seqstack s,int (*visit)(Selemtype)) //从栈底到栈顶依次调用函数visit().一旦visit()失败,则操作失败
{
Selemtype *p;
p=s.base;
while (p!=s.top)
{
visit(*p); //函数指针
p++;
}
return 1;
}
void conversion() { //进制转换
seqstack S;
int N;
initstack(S);
scanf ("%d", &N);
while (N) {
push(S, N % 8);
N = N / 8;
}
int e;
while (!stackempty(S)) {
pop(S, e);
printf ( " %d", e);
}
}
int main () {
seqstack La;
printf("构造一个空栈中……\n");
initstack(La);
printf ("成功\n");
int n, e, i, top;
printf ("请输入要进栈的的个数:");
scanf ("%d", &n);
for (i=0; i<n; i++){
int temp;
printf ("输入入栈的的第%d个元素:\n", i+1);
scanf ("%d", &temp);
push(La, temp);
}
printf("本栈是空栈吗??\n");
if (stackempty(La) == 1)
printf("YES !!!\n");
else
printf("NO !!!\n");
printf("遍历:");
stacktraverse(La, Print);
puts("");
printf ("栈长:%d\n", stacklength(La));
top = gettop(La, e);
printf ("栈顶元素:%d\n", top);
push(La, 8);
printf("遍历:");
stacktraverse(La, Print);
puts("");
printf ("栈长:%d\n", stacklength(La));
pop(La, e);
printf("出栈的元素是:%d\n", e);
printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n",
*La.top);//判断出栈后元素是否还存在于内存中
printf ("开始清空栈……\n");
clearstack(La);
printf("现在栈中的元素是:\n");
stacktraverse(La, Print);
if(destroystack(La))
printf ("销毁成功\n");
else
printf ("你失败了\n");
// conversion();
return 0;
}
C语言实现顺序栈
最新推荐文章于 2022-04-15 22:46:31 发布