#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char DataType;
#include "LinkStack.h"
void main()
{
LinkStack S;
DataType ch[50], e, *p;
InitStack(&S);
printf("请输入进栈的字符:");
gets(ch);
p = &ch[0];
while (*p)
{
PushStack(S, *p);
p++;
}
printf("当前栈顶元素是:");
if (GetStack(S, &e) == 0)
{
printf("栈已空!\n");
return;
}
else
printf("%4c\n", e);
printf("当前栈中元素的个数是:%d\n", LengthStack(S));
printf("元素出栈的序列是:");
while (!StackEmpty(S))
{
PopStack(S, &e);
printf("%4c", e);
}
printf("\n");
}
/*LinkStack.h函数*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LstackNode,*LinkStack;
/*链栈初始化操作*/
void InitStack(LinkStack *top)
{
if ((*top = (LinkStack)malloc(sizeof(LstackNode))) == NULL)
exit(-1);
(*top)->next = NULL; //将头结点的指针域置为空
}
/*判断链栈是否为空*/
int StackEmpty(LinkStack top)
{
if (top->next == NULL)
return 1;
else
return 0;
}
/*进栈操作*/
int PushStack(LinkStack top, DataType e)
{
LinkStack p;
if ((p = (LinkStack)malloc(sizeof(LstackNode))) == NULL)
{
printf("内存分配失败!");
exit(-1);
}
p->data = e;//指针p指向头结点
p->next = top->next;
top->next = p;
return 1;
}
/*出栈操作*/
int PopStack(LinkStack top, DataType *e)
{
LinkStack p;
p = top->next;
if (!p)
{
printf("栈已空!");
return 0;
}
top->next = p->next; //将栈顶结点与链表断开,即出栈
*e = p->data; //将出栈元素赋给e
free(p); //释放p指向的结点
return 1;
}
/*取栈顶元素*/
int GetStack(LinkStack top, DataType *e)
{
LinkStack p;
p = top->next;
if (!p)
{
printf("栈已空!");
return 0;
}
*e = p->data; //将p指向的结点元素赋给e
return 1;
}
/*求表长操作*/
int LengthStack(LinkStack top)
{
LinkStack p;
int count = 0;
p = top; //p指向栈顶指针
while (p->next != NULL)
{
p = p->next; //依次访问栈中的结点
count++; //每次找到一个结点,计数器加一
}
return count; //返回栈的长度
}
/*销毁链栈*/
void DestoryStack(LinkStack top)
{
LinkStack p,q;
p = top;
while (!p)
{
q = p;
p = p->next;
free(q);
}
}