栈基本概念:
栈(stack)是限定在表尾进行插入和删除操作的线性表(或单链表)。
//只能在一端进行插入和删除,因此不存在,在中间进行插入 。表头称为栈底,表尾称为栈顶
空栈:不含任何数据元素的栈。
后进先出或者先进后出
栈的插入操作(push),叫做进栈,或压栈,或入栈
删除操作(pop),叫做出栈,或弹栈
typedef struct Node //链栈结点
{
int date; //结点数据
struct Node *next; //后续结点指针
}LinkStackNode;
typedef struct satck //链栈结构
{
LinkStackNode* top; //栈顶
int length; //链栈长度
}LinkStack;
链栈结构中的top指向Node结构体类型(栈顶),length则记录Node结构体数量(链栈长度)
LinkStack* InitStack()//初始化
{
LinkStack *S=(LinkStack*)malloc(sizeof(LinkStack));
S->top=NULL;
S->length=0;
return S;
}
让S->top指向空,S->length赋值为0,表示此时为空栈
//入栈
void push(LinkStack *S)
{
int m,i;
int elem; //入栈元素
printf("请输入你需要入栈数据的个数: ");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("你输入的第%d个数据为 :",i+1);
scanf("%d",&elem); //输入数据
LinkStackNode* temp = (LinkStackNode *)malloc(sizeof(LinkStackNode));//申请一个新结点
temp -> date = elem; //将数据付给date
temp -> next = S->top; //让新建结点的下一个结点等于现在的栈顶结点
S -> top = temp; //新元素作栈顶指针
S -> length ++; //链栈长度加一
}
}
//出栈
void pop(LinkStack *S)
{
if(S->length == 0) //判断栈是否为空
{
printf("栈空\n");
}
int m,i=0;
printf("最多可出栈%d次,输入多余%d次则出栈最大次数\n",S->length,S->length);
printf("请输入出栈的次数:");
scanf("%d",&m);
if(m>(S->length))
{
m=S->length;
}
printf("出栈结果为: \n ");
while(m--)
{
i++;
LinkStackNode *temp=S->top;
printf("第%d次 %d\n",i,temp->date); //输出结点数据
S->top=temp->next; //让栈顶等于新建结点的下一个结点
free(temp); //释放掉结点temp
S->length--; //结点个数减一
}
printf("\n\n");
}
main函数代码如下:
int main()
{
int i; //用于选择的变量
LinkStack *S; //创建栈变量I
S=InitStack();
while(1)
{
printf("请选择下列操作\n");
printf("1:进栈操作\n");
printf("2:出栈操作\n");
printf("3:退出\n");
scanf("%d",&i);
switch(i)
{
case 1:push(S); break; //进栈操作
case 2:pop(S); break; //出栈操作
case 3:exit(0); //退出程序
default:
printf("输入错误,请重新输入!!!\n");
break;
}
}
printf("\n");
system ("pause");
return 0;
}