#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; typedef int Status; #define OVERFLOW -2 #define ERROR 0 #define OK 1 #define MAXSIZE 100 typedef struct { int *base; int *top; int stacksize; }SqStack; /**栈的创建和初始化**/ Status InitStack(SqStack *s) { s->base=(int *)malloc(sizeof(int)); if(!s->base) exit(OVERFLOW); s->stacksize=MAXSIZE; s->top=s->base; return OK; } /**入栈**/ Status Push(SqStack *s,int e) { if(s->top-s->base==s->stacksize) return ERROR;//栈满 *(s->top)++=e; return OK; } /**出栈**/ Status pop(SqStack *s,int *e) { if(s->base==s->top) return ERROR; *e=*--s->top; return OK; } int main() { SqStack s,s1; int a,i,b,c,d; printf("创建栈\n"); if(!InitStack(&s)) printf("创建失败\n\n"); else printf("创建成功\n\n"); printf("给栈内填充数据\n"); printf("输入栈内的数据个数:"); cin>>a; printf("输入数据:\n"); for(i=0;i<a;i++) { cin>>b; if(!Push(&s,b)) printf("栈满\n"); } if(!InitStack(&s1)) printf("创建栈失败\n\n"); printf("栈按顺序输出为:\n"); for(i=0;i<a;i++) { if(!pop(&s,&d)) printf("栈空\n"); else { printf("%d ",d); if(!Push(&s1,d)) printf("栈满\n\n"); } } printf("\n"); printf("栈逆序输出为:\n"); for(i=0;i<a;i++) { if(!pop(&s1,&d)) printf("栈空\n"); else printf("%d ",d); } printf("\n"); system("pause"); return 0; }
时间: 2024-04-28 20:20:40 浏览: 6
这段代码实现了一个栈数据结构,并且可以将栈中的数据逆序输出。具体实现过程如下:
首先定义了一个结构体`SqStack`,包含一个指向栈底的指针`base`、一个指向栈顶的指针`top`和栈的最大容量`stacksize`。然后定义了三个宏常量`OVERFLOW`、`ERROR`和`OK`,分别表示栈满、出错和正常状态。
接下来定义了三个函数:`InitStack`函数用于创建和初始化栈;`Push`函数用于将元素压入栈中;`pop`函数用于将栈顶元素弹出栈。在`InitStack`函数中,首先动态分配一个大小为`MAXSIZE`的数组作为栈空间,然后将栈顶指针和栈底指针都指向栈底,最后将栈的最大容量设置为`MAXSIZE`。在`Push`函数中,首先判断栈是否已满,如果已满则返回`ERROR`,否则将元素压入栈中。在`pop`函数中,首先判断栈是否为空,如果为空则返回`ERROR`,否则将栈顶元素弹出栈,并将其保存在指针`e`所指向的地址中。
在`main`函数中,首先创建了两个栈`s`和`s1`,并调用`InitStack`函数初始化这两个栈。然后通过循环调用`Push`函数向栈`s`中依次添加输入的数据。接下来,通过循环调用`pop`函数将栈`s`中的元素逐个弹出,同时将其保存在栈`s1`中。最后,通过循环调用`pop`函数将栈`s1`中的元素逐个弹出并输出,从而实现了栈中元素逆序输出的功能。
需要注意的是,在输入数据时,用户需要先输入数据的个数,然后再依次输入每个数据。