直接附上栈的初始化,入栈,遍历栈,求栈长的操作
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 3
#define STACKINCREMENT 3
typedef int SElemType;
typedef int Status;
typedef struct{
SElemType *top;
SElemType *base;
int stacksize;
}sqStack;
//判单栈空
bool StackFull(sqStack *s){
if(s->top - s->base >= s->stacksize)
return true;
else
return false;
}
//初始化栈
Status StackInit(sqStack *s){
s->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!s->base){
return ERROR;
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
return OK;
}
//入栈
void Push(sqStack *s,SElemType e){
if(StackFull(s)){
printf("栈满,");
s->base = (SElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s->base)
exit(0);
printf("动态增容3\n");
s->top = s->base + s->stacksize;
s->stacksize = s->stacksize + STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
//从顶部遍历
void StackTraverse(sqStack *s){
SElemType *p;
p = s->top;
while(p>s->base){
p--;
printf("%d ",*p);
}
}
//从底部遍历
void StackBaseTraverse(sqStack &s){//....
SElemType *p;
p = s.base;
while(p<s.top){
printf("%d ",*(p++));
}
}
/*void print(SElemType c){
printf("%d",c);
}
void StakTraverse(sqStack *s,void(*Visit)(SElemType)){
if(s->top > s->base)
Visit(*(s->base++));
}*/
//栈的长度
int StackLength(sqStack *s){
return s->top - s->base;
}
int main(){
sqStack s;
SElemType e;
StackInit(&s);
int i = 2;
printf("当输入0时,(0不算元素)输入终止...\n");
printf("请输入第1个栈的值:\n");
while(scanf("%d",&e)!=EOF && e != 0){
Push(&s,e);
printf("请输入第%d个栈的值:\n",i);
i++;
}
int len;
len = StackLength(&s);
printf("0未读入栈\n");
printf("栈的长度为%d\n",len);
printf("从栈顶开始遍历:\n");
StackTraverse(&s);
//StackTraverse(&s,print);
printf("\n");
printf("从底部循环遍历的值是:\n");
StackBaseTraverse(s);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 3
#define STACKINCREMENT 3
typedef int SElemType;
typedef int Status;
typedef struct{
SElemType *top;
SElemType *base;
int stacksize;
}sqStack;
bool StackFull(sqStack &s){
if(s.top - s.base >= s.stacksize)
return true;
else
return false;
}
Status StackInit(sqStack &s){
s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!s.base)
return ERROR;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}
void Push(sqStack &s,SElemType e){
if(StackFull(s)){
printf("栈满,");
s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT) *sizeof(SElemType));
if(!s.base)
exit(0);
printf("动态增容3\n");
s.top = s.base + s.stacksize;
s.stacksize = s.stacksize + STACKINCREMENT;
}
*s.top = e;
s.top++;
}
void StackTraverse(sqStack &s){
SElemType *p;
p = s.top;
printf("从顶部循环遍历的值是:\n");
while(p>s.base){
p--;
printf("%d ",*p);
}
}
void StackBaseTraverse(sqStack &s){
SElemType *p;
p = s.base;
while(p<s.top){
printf("%d ",*(p++));
}
}
/*
void print(SElemType c)
{
printf("%d ",c);
}
void StackTraverse(sqStack &s,void(*Visit)(SElemType)){
while(s.top > s.base)
Visit(*(s.base)++);
}
*/
int StackLength(sqStack &s){
return s.top - s.base;
}
int main(){
sqStack s;
SElemType e;
StackInit(s);
int i = 2;
printf("当输入0时,(0不算元素)输入终止...\n");
printf("请输入栈的第1个元素值:\n");
while(scanf("%d",&e)!=EOF && e!= 0){
Push(s,e);
printf("请输入栈的第%d个值:\n",i);
i++;
}
int len = 0;
len = StackLength(s);
printf("栈的长度为:%d\n",len);
StackTraverse(s);
//StackTraverse(s,print);//与上面注释部分一起用
printf("\n");
printf("从底部循环遍历的值是:\n");
StackBaseTraverse(s);
return 0;
}
还有一个操作:
运行结果:
当输入0时,(0不算元素)输入终止...
请输入第1个栈的值:
1
请输入第2个栈的值:
2
请输入第3个栈的值:
3
请输入第4个栈的值:
4
栈满,动态增容3
请输入第5个栈的值:
5
请输入第6个栈的值:
0
0未读入栈
栈的长度为5
从栈顶开始遍历:
5 4 3 2 1
从底部循环遍历的值是:
1 2 3 4 5
Process returned 0 (0x0) execution time : 5.826 s
Press any key to continue.