#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//顺序栈(从0开始存储,先移动栈顶指针,再。。。)
#define MAXSIZE 100 //顺序栈空间存储量
typedef int DataType; //顺序栈元素类型
typedef struct{
DataType *data; //顺序栈空间元素存储基址
int top; //栈顶
}SeqStack; //顺序栈类型
int go_on(){
int flag=1,i;
char choice;
while (1) {
printf("继续请输入1,停止请输入0\n");
scanf("%d",&i);
if (i==1) {
break;
}
else if (i==0) {
flag=0;
break;
}
else {
printf("请按要求输入,谢谢\n");
}
}
return (flag);
}
//初始化,构造一个空顺序栈
void Init_SeqStack(SeqStack *S,int n){
S->data=(DataType *)malloc(n*sizeof(DataType));
if (S->data==NULL) {
printf("\n内存分配失败\n");
exit(-1);
}
S->top=-1;
}
// 判断顺序栈是否为空
int Empty_SeqStack(SeqStack *S){
if (S->top==-1) {
return 1;
}
else {
return 0;
}
}
// 判断顺序栈是否为满
int Full_SeqStack(SeqStack *S){
if (S->top==MAXSIZE-1) {
return 1;
}
else{
return 0;
}
}
// 入栈,插入元素e为新的栈顶元素
int Push_SeqStack(SeqStack *S,DataType e){
if (Full_SeqStack(S)==1) {
printf("\n栈满,不能入栈\n");
}
else {
S->top++;
S->data[S->top]=e;
return 1;
}
}
void Push(SeqStack *S){
DataType x;
int flag=1,push_flag;
while (flag) {
printf("\n请输入要入栈的元素\n");
scanf("%d",&x);
push_flag=Push_SeqStack(S,x);
if (push_flag==1) {
printf("\n入栈成功\n");
}
else {
printf("\n入栈失败\n");
}
flag=go_on();
}
}
// 出栈,删除栈顶元素,并由*e返回其值
int Pop_SeqStack(SeqStack *S,DataType *e){
if (Empty_SeqStack(S)==1) {
printf("\n栈空,不能出栈\n");
return 0;
}
else {
*e=S->data[S->top];
S->top--;
return 1;
}
}
void Pop(SeqStack *S){
DataType x;
int flag=1,pop_flag;
while (flag) {
pop_flag=Pop_SeqStack(S,&x);
if (pop_flag==1) {
printf("\n出栈成功,出栈的元素为%d\n",x);
}
else {
printf("\n出栈失败\n");
}
flag=go_on();
}
}
// 取栈顶元素,并由*e返回其值
int GetTop_SeqStack(SeqStack *S,DataType *e){
if (Empty_SeqStack(S)==1) {
printf("\n栈空,不能取栈顶元素\n");
return 0;
}
else {
*e=S->data[S->top];
return 1;
}
}
// 输出栈顶元素
void Display_Top(SeqStack *S){
DataType e;
if (Empty_SeqStack(S)==1) {
printf("\n栈空,没有元素\n");
}
else {
GetTop_SeqStack(S,&e);
printf("\n栈顶元素%4d\n",e);
}
}
void Display_SeqStack(SeqStack *S){
int i;
if (Empty_SeqStack(S)==1) {
printf("\n栈空\n");
}
else {
printf("\n栈全部元素\n");
printf("栈底<--------------------->栈顶\n");
for (i=0; i<=S->top;i++) {
printf("%6d\n",S->data[i]);
}
}
}
main(){
SeqStack S;
int flag=1,j;
Init_SeqStack(&S,MAXSIZE);
do {
printf("\n");
printf("-------顺序栈动态数组的实现---------\n");
printf("入栈请摇1\n");
printf("出栈请摇2\n");
printf("输出栈顶元素请摇3\n");
printf("输出全部元素请摇4\n");
printf("退出请摇0\n");
printf("----------------------\n");
scanf("%d",&j);
switch (j) {
case 1:Push(&S);break;
case 2:Pop(&S);break;
case 3:Display_Top(&S);break;
case 4:Display_SeqStack(&S);break;
case 0:flag=0;printf("感谢大哥的使用\n");break;
}
}while (flag==1);
}
栈的实现C语言
最新推荐文章于 2024-05-22 20:51:37 发布