栈
warning:
这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
栈比链表,顺序表简单,遵守先入后出原则,入栈/出栈只能操作栈顶元素。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stacksize 10//栈初始最大长度
typedef struct{
int *data;//栈的游标指针
int top;//栈顶
int size;//栈容量
}Stack;//创建栈
int emptystack(Stack* S){
return S->top==0;
}//判断是否为空栈
Stack* initstack(){
Stack* S=(Stack*)malloc(sizeof(Stack));//分配栈空间
S->data=(int*)malloc(sizeof(int)*(stacksize));//分配data数组空间
S->top=0;//初始化栈顶从0开始
S->size=stacksize;//设置栈数组最大容量
int judge=emptystack(S);
if(judge==1)//判断栈是否为空
printf("栈创建成功,当前为空栈\n");
else
printf("栈创建失败,当前不为空\n");
return S;
}//初始化栈
void printstack1(Stack* S){
Stack* smove=S;
for(int i=smove->top-1;i>=0;i--){
printf("%d ",smove->data[i]);
}
printf("\n");
}//按出栈顺序输出栈
void printstack2(Stack* S){
Stack* smove=S;
for(int i=0;i<smove->top;i++){
printf("%d ",smove->data[i]);
}
printf("\n");
}//按入栈顺序输出栈
void increasestack(Stack* S){
int increasesize;
printf("请输入需增加的栈容量(单位为int):");
scanf("%d",&increasesize);
int Flag=1;
int* increasedata=NULL;//定义新指针扩容data数组
while(Flag){
increasedata=(int*)realloc(S->data,sizeof(int)*((S->size)+increasesize));
//扩容data数组
if(increasedata!=NULL){
Flag=0;//结束循环
}
}
S->data=increasedata;
S->size=(S->size)+increasesize;
printf("栈扩容成功,当前栈最大容量为%d\n",S->size);
}//增加栈容量
void pushstack(Stack* S){
int value;
printf("请输入需入栈元素值:");
scanf("%d",&value);
if(S->top==S->size){
increasestack(S);//调用扩容函数
S->data[S->top]=value;//每次push的元素为当前新栈顶
S->top=S->top+1;
}//栈溢出自动扩容
else{
S->data[S->top]=value;
S->top=S->top+1;
}
printf("该元素已入栈\n");
}//入栈
void popstack(Stack* S){
if(S->top==0){
printf("当前栈为空\n");
}
else{
S->top=S->top-1;
printf("栈顶元素已出栈\n");
}
}//出栈
void returntop(Stack* S){
printf("当前栈顶元素值为%d\n",S->data[S->top-1]);
}//返回栈顶元素
void returnlen(Stack* S){
printf("当前栈长度为%d\n",S->top);
}//返回栈长度
void searchstack(Stack* S){
int value;
printf("请输入需查询的元素:");
scanf("%d",&value);
for(int i=0;i<S->size;i++){
if(S->data[i]==value){
printf("查询成功,该元素在第%d位\n",i+1);
return;
}
}
printf("查询失败,栈中无该元素\n");
}//查询栈中元素
void clearstack(Stack* S){
if(S==NULL)//当前栈已为空
return;
else{
free(S->data);
free(S);
}
printf("当前栈已清空,已自动退出程序\n");
exit(0);
}//清空栈
void endsystem(Stack* S){
clearstack(S);
exit(0);
}//结束程序
void stackmenu(){
printf("1.按出栈顺序输出栈\n");
printf("2.按入栈顺序输出栈\n");
printf("3.栈扩容\n");
printf("4.元素入栈\n");
printf("5.元素出栈\n");
printf("6.返回栈顶元素\n");
printf("7.返回栈长度\n");
printf("8.根据值查询元素位置\n");
printf("9.清空栈\n");
printf("0.退出程序\n");
}//栈功能菜单
int main(){
Stack* S=initstack();//初始化创建栈
int sort,flag=1;
while(flag){
stackmenu();
printf("请输入数字选择功能:");
scanf("%d",&sort);
switch(sort){
case 1:{
printstack1(S);
break;
}
case 2:{
printstack2(S);
break;
}
case 3:{
increasestack(S);
break;
}
case 4:{
pushstack(S);
break;
}
case 5:{
popstack(S);
break;
}
case 6:{
returntop(S);
break;
}
case 7:{
returnlen(S);
break;
}
case 8:{
searchstack(S);
break;
}
case 9:{
clearstack(S);
break;
}
case 0:{
endsystem(S);
break;
}
}
printf("\n");
}
}
评论已关闭