#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
typedef enum Status
{
ERROR = 0,
SUCCESS = 1
} Status;
typedef int ElemType;
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
Status initLStack(LinkStack *s);
Status isEmptyLStack(LinkStack *s);
Status getTopLStack(LinkStack *s);
Status clearLStack(LinkStack *s);
Status destroyLStack(LinkStack *s);
Status LStackLength(LinkStack *s);
Status pushLStack(LinkStack *s);
Status popLStack(LinkStack *s);
void TraverseStack(LinkStack* s);
void checkinput(int* r);
#endif
#include"LinkStack.h"
#include <stdio.h>
#include <stdlib.h>
Status initLStack(LinkStack* s)
{
s->top = (LinkStackPtr)malloc(sizeof(StackNode));
s->top->next = NULL;
s->count = 0;
return SUCCESS;
}
Status isEmptyLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return SUCCESS;
}
else {
printf("\n这不是一个空链栈!\n");
return ERROR;
}
}
Status getTopLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return ERROR;
}
else {
printf("\n栈顶元素为:%d\n", s->top->next->data);
return SUCCESS;
}
}
Status clearLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return ERROR;
}
else {
LinkStackPtr ptem, p = s->top->next;
while (p) {
ptem = p->next;
free(p);
p = ptem;
}
s->count = 0;
printf("\n链栈清空成功\n");
return SUCCESS;
}
}
Status destroyLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
while (s->top) {
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
p = s->top->next;
free(s->top);
s->top = p;
s->count--;
if(!s->top)
printf("\n链栈销毁成功\n");
}
}
Status LStackLength(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return ERROR;
}
else {
printf("\n链栈长度为:%d\n", s->count);
return SUCCESS;
}
}
Status pushLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else {
StackNode* p;
p = (StackNode*)malloc(sizeof(StackNode));
printf("\n请输入你的数据:\n");
checkinput(&(p->data));
p->next = s->top->next;
s->top->next = p;
s->count++;
printf("\n入栈成功\n");
TraverseStack(s);
return SUCCESS;
}
}
Status popLStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return ERROR;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return ERROR;
}
else {
LinkStackPtr ptem, p = s->top->next;
ptem = p->next;
free(p);
s->top->next = ptem;
s->count--;
printf("\n出栈成功\n");
TraverseStack(s);
return SUCCESS;
}
}
void TraverseStack(LinkStack* s)
{
if (!s->top) {
printf("\n请先输入【1】创建链栈!\n");
return;
}
else if (s->count == 0) {
printf("\n这是一个空链栈!\n");
return;
}
else {
LinkStackPtr p = s->top->next;
printf("\n链栈为:\n\n【top】 <-");
while (p) {
printf("【%d】 <- ", p->data);
p = p->next;
}
printf("【bottom】\n\n");
printf("\n现在链栈长度为:%d\n", s->count);
return;
}
}
void checkinput(int* r) {
int error = 0, i = 0;
char c[50] = { 0 };
do {
gets(c);
error = 0;
for (i = 0; c[i] != '\0'; i++) {
if (i == 0 && c[i] == '-')
{
continue;
}
if (c[i] < '0' || c[i]>'9')
error = 1;
}
if (error) printf("输入错误,请重新输入!\n");
} while (error);
*r = atoi(c);
}
#include"LinkStack.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, num,sizes;
int* length = (int*)malloc(sizeof(int));
ElemType data = 0;
ElemType* e = (ElemType*)malloc(sizeof(ElemType));
LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack*));
s->top = NULL;
while (1) {
system("cls");
printf("\t\t\t|----------------------------------|\n");
printf("\t\t\t| 链栈基本操作 |\n");
printf("\t\t\t|----------------------------------|\n");
printf("\t\t\t| 1---创建链栈 |\n");
printf("\t\t\t| 2---判断是否为空 |\n");
printf("\t\t\t| 3---得到栈顶元素 |\n");
printf("\t\t\t| 4---清空链栈 |\n");
printf("\t\t\t| 5---销毁链栈 |\n");
printf("\t\t\t| 6---获取栈长 |\n");
printf("\t\t\t| 7---压栈 |\n");
printf("\t\t\t| 8---出栈 |\n");
printf("\t\t\t| 9---遍历输出 |\n");
printf("\t\t\t| 10---退出 |\n");
printf("\t\t\t|----------------------------------|\n");
printf("\t\t\t| 前端-Sheldonlee |\n");
printf("\t\t\t|----------------------------------|\n");
printf("\n请选择操作:\n");
checkinput(&num);
if (num >= 1 && num <= 10) {
switch (num) {
case 1: {
if (s->top != NULL) {
printf("\n已存在一个链栈,请先销毁此栈!\n");
}
else {
printf("请输入你的顺序栈长度:");
initLStack(s);
checkinput(&sizes);
if (sizes>= 0) {
for (i = 0; i < sizes; i++) {
pushLStack(s);
}
printf("\n链栈创建成功\n");
}
else {
printf("\n链栈初始化失败,长度输入错误!\n");
}
}
break;
}
case 2: {
isEmptyLStack(s);
break;
}
case 3: {
getTopLStack(s);
break;
}
case 4: {
clearLStack(s);
break;
}
case 5: {
destroyLStack(s);
break;
}
case 6: {
LStackLength(s);
break;
}
case 7: {
pushLStack(s);
break;
}
case 8: {
popLStack(s);
break;
}
case 9: {
TraverseStack(s);
break;
}
case 10:
destroyLStack(s);
system("cls");
printf("\n\n\n\n\n\n\n\t\t\t\t尚有很多不足之处,望多多指教!\n\n\n\n\n\n\n");
exit(0);
break;
}
}
else
{
printf("\n请输入正确的数字。\n");
}
system("pause");
}
return 0;
}