/*
栈的链式存储结构
不断声明一个结构体去存储值
top 指向 栈顶
count 用来计算栈的个数
*/
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct StackNode{
ElementType data; //存放栈的数据
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top; // top指针
int count; // 栈元的计数器
}LinkStack;
// 进站
StackNode *Push(StackNode *L, ElementType data){
StackNode *node;
node = (LinkStackPtr)malloc(sizeof(StackNode));
node->data = data;
node->next = L;
return node;
}
// 出站
void Pop(LinkStack *ptr){
StackNode *node, *topnext;
node = ptr->top;
topnext = node->next;
free(node);
ptr->top = topnext;
ptr->count--;
}
// 打印值
void printStack(StackNode *L){
while(L->next){
printf("%c->", L->data);
L = L->next;
}
printf("\n");
}
// 屏幕输入元素
void screenPop(LinkStack *ptr){
ElementType data;
StackNode *top;
printf("输入字符,回车结束: ");
while(1){
scanf("%c", &data);
if(data == '\n'){
printf("\n");
fflush(stdin);
return;
}
printf("Push->%c\t", data);
top = Push(ptr->top, data);
ptr->top = top;
ptr->count++;
}
}
int main(int argc, char const *argv[])
{
/* code */
StackNode *stractHead;
LinkStack *stractPtr;
char oprator;
// 初始化两个链表
stractHead = (LinkStackPtr)malloc(sizeof(StackNode));
stractPtr = (LinkStack *)malloc(sizeof(LinkStack));
stractPtr->top = stractHead;
stractPtr->count = 0;
printf("A: 入栈\n");
printf("B: 出栈\n");
printf("C: 计算栈大小\n");
printf("D: 打印栈数据\n");
printf("Q: 退出\n");
while(1){
printf("-----------------输入操作: ");
scanf("%c", &oprator);
getchar();
switch(oprator){
case 'A':
screenPop(stractPtr);
break;
case 'B':
if(stractPtr->top == stractHead){
printf("头结点不用删除\n");
} else {
Pop(stractPtr);
}
printStack(stractPtr->top);
break;
case 'C':
printf("当前栈的大小是: %d\n", stractPtr->count);
break;
case 'D':
printStack(stractPtr->top);
break;
case 'Q': exit(0);
}
fflush(stdin);
}
return 0;
}