链栈的插入、删除操作
使用指针需注意:----链接----
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct LinkStack
{
//数据域
char data;
struct LinkStack *next;
}LinkStack;
//带着栈顶指针top的链栈
typedef struct StackTop
{
LinkStack *top;
}StackTop;
/*栈的初始化*/
void InitStack(StackTop *S)
{
S->top = NULL;
}
/*判空操作*/
int Empty(StackTop *S)
{
return (S->top == NULL);
}
/*链栈入栈操作,也像头插法*/
void Push(StackTop *S, char x)
{
LinkStack *p;
//创建一个新结点
p = (LinkStack *)malloc( sizeof( LinkStack ) );
p->data = x;
p->next = S->top;
S->top = p;
}
/*链栈出栈操作*/
void Pop(StackTop *S)
{
LinkStack *p;
if ( Empty(S) )
{
printf("\n空栈!\n");
}
else
{
p = S->top;
printf("\n\n出栈元素:%c\n",p->data);
//栈顶位置变化
S->top = p->next;
free(p);
}
}
/*取栈顶元素*/
void GetTop(StackTop *S)
{
LinkStack *p;
if ( Empty( S ) )
{
printf("\n\n链栈为空\n");
}
else
{
p = S->top;
printf("\n\n栈顶元素:%c ",p->data);
}
}
/*遍历输出栈中所有元素--头插法建立的链栈,栈顶在最前面,栈底在最后面*/
void PrintStack(StackTop *S)
{
printf("\n打印栈元素:");
LinkStack *p;
//指向链栈第一个结点
p = S->top;
while( p )
{
printf("%c ", p->data);
p = p->next;
}
}
int main()
{
int i;
StackTop st;
InitStack( &st );
//26字母链栈
for(i=1; i<=26; i++)
{
Push(&st, i+'a'-1);
}
PrintStack( &st );
GetTop( &st );
Pop( &st );
PrintStack( &st );
printf("\n");
}