//本人所作博客为学习复习所用,如有不对之处还望指出
模拟堆栈
程序设计题目要求:
编写一个程序模拟堆栈,要求能够模拟、入栈、出栈等基本操作。栈中元素可用整数代替。不能使用C++模板库预定义的类型。程序运行中可输入多组入栈、出栈操作,每次操作后展示栈中元素。
思路:该题涉及部分简单数据结构的知识——堆栈。我的思路是:用数组来表示栈,然后用一个指向栈顶的指针,通过自增自减来实现堆栈中元素的操作。并且与用户进行交互来决定接下来的操作是入栈、出栈还是退出程序。
代码如下:
/*
* 堆栈:一端固定,一端浮动
* 所有数据的存入或取出,只能在浮动的一端(栈顶)进行 ,严格按照“先进后出”的原则获取
* 位于中间的元素,必须在其栈上面的元素(后入栈者)逐个移除后才能取出
*
*/
#include<stdio.h>
enum{length=10};//定义枚举常量length表示栈的长度、容量
int push(int *stack,int len,int *toppointer,int x)
{//指向表示栈的数组的指针,栈的长度,指向栈顶的指针,入栈的元素
if(*toppointer>=len)
{
return 1;
}//超过了栈的长度,栈满
stack[*toppointer]=x; //把x作为栈顶元素
(*toppointer)++;
return 0;
}//入栈函数,用于将元素送入栈中
int pop(int *stack,int *toppointer,int *cp)
{
if(*toppointer==0)
{
return 1;
}//栈顶指针指向0,说明栈中没有元素,栈空
(*toppointer)--;
*cp=stack[*toppointer];//将出栈元素保存
return 0;
}//出栈函数,用于将栈中的元素送出
void ShowStack(int *stack,int toppointer)
{
int i;
for(i=toppointer-1;i>=0;i--)
{
printf("%d\n",stack[i]);
}
}//自顶向下展示栈中的元素
void main()
{
int stack[length];//表示栈的数组
int elem;//入栈的元素
int top=0;//栈顶
int selection;//操作选择
while(1)
{
printf("请选择,1:入栈,2:出栈,3:退出程序\n");
scanf("%d",&selection);//输入用户的选择
if(selection==3)
{
return ;
}//直接退出程序
else if(selection==1)
{
printf("请输入进栈元素: ");
scanf("%d",&elem); //输入入栈元素
if(push(stack,length,&top,elem)==0)
{
printf("此时栈内元素为:\n");
ShowStack(stack,top);
printf("\n");
}
else
{
printf("栈满\n");
printf("\n");
}
}
else if(selection==2)
{
if(pop(stack,&top,&elem)==0)
{
printf("出栈元素为: %d\n",elem);
printf("此时栈内元素为:\n");
ShowStack(stack,top);
printf("\n");
}
else
{
printf("栈空\n");
printf("\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}