#include
#include
#define MAXSIZE 10
#define OK 1
#define ERROR 0;
typedef int Status;
typedef struct stackStruct{
int data[MAXSIZE];
int top;
} Stack;
typedef struct stackStruct* STACK;
void PleaseInit(void);
int printMenu(void);
Status initStack(STACK* doublePointers);
Status insertStack(STACK* doublePointers,int SIZE);
Status printElementNumber(const STACK* doublePointers);
Status returnStackTop(const STACK* doublePointers);
Status destroyStack(STACK* doublePointers);
Status stackEmpty(const STACK* doublePointers);
Status clearStack(STACK* doublePointers);
Status pop(STACK* doublePointers);
int main(int argc, char *argv[]) {
int menuChoice;
STACK pointer=NULL;//创建指向该结构类型的指针
while(menuChoice=printMenu())
{
switch(menuChoice)
{
case 1:
initStack(&pointer);
break;
case 2:
destroyStack(&pointer);
break;
case 3:
clearStack(&pointer);
break;
case 4:
stackEmpty(&pointer);
break;
case 5:
returnStackTop(&pointer);
break;
case 6:
insertStack(&pointer,MAXSIZE);
break;
case 7:
pop(&pointer);
break;
case 8:
printElementNumber(&pointer);
break;
}
}
return 0;
}
//打印菜单
int printMenu(void)
{
int choice;
printf("****************顺序栈练习******************\n");
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("按下0退出程序\n");
printf("*******************************************\n");
printf("请选择:");
scanf("%d",&choice);
return choice;
}
//1:初始化顺序栈
Status initStack(STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--1:初始化顺序栈--\n");
if((*doublePointers)!=NULL)
{
printf("请勿重复操作\n");
return ERROR;
}
*doublePointers=(STACK)malloc(sizeof(Stack));
if((*doublePointers)==NULL)
{
printf("初始化失败\n");
return ERROR;
}
(*doublePointers)->top=0;//top指向栈底
printf("初始化成功!\n");
//printf("分配的地址为:%p",*doublePointers);
return OK;
}
//2:销毁栈
Status destroyStack(STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--2:销毁栈--\n");
char inputChar;
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
printf("是否销毁栈?(Y/N)");
scanf(" %c",&inputChar);
if(inputChar=='Y'||inputChar=='y')
{
//printf("清除的分配地址为:%p",*doublePointers);
free((*doublePointers));
(*doublePointers)=NULL;
printf("销毁成功!\n");
}
fflush(stdin);
return OK;
}
//3:清空栈
Status clearStack(STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--3:清空栈--\n");
char inputChar;
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
if((*doublePointers)->top==0)
{
printf("请先输入一些元素吧\n");
return OK;
}
printf("是否清空栈?(Y/N)");
scanf(" %c",&inputChar);
if(inputChar=='Y'||inputChar=='y')
{
(*doublePointers)->top=0;
printf("清空成功!\n");
}
fflush(stdin);
return OK;
}
//4:栈是否为空
Status stackEmpty(const STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--4:栈是否为空--\n");
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
if((*doublePointers)->top==0)
{
printf("当前栈为空栈\n");
return OK;
}
printf("当前栈为不空栈\n");
return OK;
}
//5:返回栈顶元素
Status returnStackTop(const STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--5:返回栈顶元素--\n");
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
if((*doublePointers)->top==0)
{
printf("请先输入一些元素吧\n");
return ERROR;
}
printf("当前栈顶元素为:%d\n",(*doublePointers)->data[(*doublePointers)->top-1]);
return OK;
}
//6:插入元素到栈中
Status insertStack(STACK* doublePointers,int SIZE)
{
system("cls");//清屏
printf("当前选的为--6:插入元素到栈中--\n");
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
int inputNumber,i,inputValue,leavingsPosition;
leavingsPosition=SIZE-((*doublePointers)->top);
printf("当前有%d个空闲位置,请输入要插入的元素个数:",leavingsPosition);
scanf("%d",&inputNumber);
if(inputNumber<1||inputNumber>leavingsPosition)
{
printf("操作失败,超长范围\n");
return ERROR;
}
printf("请输入要插入的元素:");
for(i=1;i<=inputNumber;i++)
{
scanf("%d",&inputValue);
if((*doublePointers)->top>SIZE)
{
printf("操作失败\n");
return ERROR;
}
(*doublePointers)->data[(*doublePointers)->top]=inputValue;
(*doublePointers)->top++;
}
fflush(stdin);//清除输入缓冲区,防止输入的数值过多
printf("入栈成功!\n");
return OK;
}
//7:删除栈顶元素,并返回
Status pop(STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--7:删除栈顶元素,并返回--\n");
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
if((*doublePointers)->top==0)
{
printf("请先输入一些元素吧\n");
return ERROR;
}
printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);
(*doublePointers)->top--;
printf("删除成功!\n");
return OK;
}
//8:当前栈元素个数
Status printElementNumber(const STACK* doublePointers)
{
system("cls");//清屏
printf("当前选的为--8:当前栈元素个数--\n");
if((*doublePointers)==NULL)
{
PleaseInit();
return ERROR;
}
printf("当前栈元素个数为:%d\n",(*doublePointers)->top);
return OK;
}
//请先初始化样式
void PleaseInit(void)
{
printf("**************\n");
printf("*请先初始化 *\n");
printf("**************\n\n");
}
*doublePointers=(STACK)malloc(sizeof(Stack));
(*doublePointers)->top=0;
解释:在内存中分配Stack类型的空间,并且*doublePointers指向这个内存地址。
如果分配不成功,malloc返回NULL值。所以在代码中会出现下面的判断
if((*doublePointers)==NULL)
{
printf("初始化失败\n");
return ERROR;
}
这里需要注意的就是*doublePointers,要养成外面加括号的习惯(优先级问题)。
空间分配成功的话,我们就把top=0,表示top指向栈底。
初始化的最终效果如下图
在初始化中还有下面代码,是用来检查是否重复初始化
if((*doublePointers)!=NULL)
{
printf("请勿重复操作\n");
return ERROR;
}
(一)、
typedef struct stackStruct{
int data[MAXSIZE];
int top;
} Stack;
typedef struct stackStruct* STACK;
上面定义了一个栈结构,并重新定义名为Stack,并且还定义了一个STACK。
(二)、
STACK pointer=NULL;//创建指向该结构类型的指针
声明一个指向结构的指针变量。因为刚开始没有指向,所以一定要设为NULL。它在以后可以用来判断是否栈是否初始化。
fflush(stdin);
该函数用于清空,输入缓冲区。防止当输入多输入时,对后面的操作有影响。
(三)、
initStack(&pointer);
initStack(STACK* doublePointers)
leavingsPosition=SIZE-((*doublePointers)->top);
(*doublePointers)->data[(*doublePointers)->top]=inputValue;//
(*doublePointers)->top++;
leavingsPosition是用来存储剩余空间的变量。
接下来的两个语句一个是把元素压入栈中,另一个是top+1。是栈顶上移
如下图
(原始图)
(元素进栈)
printf("当前栈顶元素为:%d\n",(*doublePointers)->data[((*doublePointers)->top)-1]);
(*doublePointers)->top--;
当前第一条语句是把栈顶元素打印,然后top指针下移。
free((*doublePointers));
(*doublePointers)=NULL;
上面两句代码用下图来说明
(原始图),没执行代码前pointer指针,doublepointer,栈(绿色框代表地址)都在。执行完如下图
(执行后)
①:初始化栈,并在栈中插入1,2,3,4。4个元素,并显示栈顶元素和当前栈元素个数
②:在上一步的基础上先删除栈顶元素,并返回,在判断栈是否为空,最后清空栈
③:在上一步基础上,判断空栈是否可以初始化,可否判断是否为空栈,可否删除栈顶元素,并返回,可否返回栈顶元素
发现不能初始化
发现可以判断,并给出提示
发现不可以删除栈顶(因为没有元素)
发现不能
④:销毁栈,并随意进行除初始化栈之外的其他操作
重复销毁时给出提示
同样清空栈是也给出提示
如有错误欢迎指出
本篇博客源代码和文件已经上传,欢迎下载