链栈的操作
链栈的操作和单链表的操作极为相象
初始化
bool InitStack(Node *s) {
if (s==NULL)
{
return false;
}
s->next = NULL;
printf("输入初始化栈的长度:");
int len;
scanf("%d", &len);
Node *p;
srand((int)time(0));
//模仿单链表的头插法
for (int i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100;
p->next = s->next;
s->next = p;
}
return true;
}
进栈
void push(Node *s) {
//头插法进栈,通过获取栈顶元素判断元素是否进栈
printf("输入入栈元素:");
int data;
Node *p = (Node*)malloc(sizeof(Node));
scanf("%d", &data);
p->data = data;
p->next = s->next;
s->next = p;
printf("\n要想知道是否进栈,请输出栈顶元素!\n");
}
出栈
void pop(Node *s) {
Node *top = s->next;
Node *p;
//出栈
while (top)
{
p = top;
printf("%d ", p->data);
top = p->next;
free(p);//利用临时节点依次删除,遍历
}
s->next = NULL;
printf("\n");
}
获取栈顶元素
int StackHead(Node *s) {
if (s->next==NULL)
{
return -1;
//判断栈是否为空
}
return s->next->data;//返回栈顶元素
}
获取栈的长度
int Length(Node *s) {
if (s==NULL)
{
return 0;//判断栈是否为空
}
Node *p = s->next;
int i = 0;
while (p)
{
i++;
p = p->next;//依次遍历栈,统计栈元素的数量
}
return i;
}
代码测试
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
typedef struct node {
int data;
struct node *next;//链栈的结构
}Node;
bool InitStack(Node *s);//初始化栈
void push(Node *s);//进栈
void pop(Node *s);//出栈
int StackHead(Node *s);//获取栈顶元素
int Length(Node *s);//获取栈的长度
int main() {
bool flag = true;
Node *s = (Node*)malloc(sizeof(Node));
int choice;
while (flag)
{
printf("\n=====链栈的操作=====\n");
printf("1.栈的初始化\n");
printf("2.进栈\n");
printf("3.出栈\n");
printf("4.获得栈顶元素\n");
printf("5.栈的长度\n");
printf("======除菜单项按任意键退出=============\n");
printf("输入你的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
if (InitStack(s))
{
printf("\n初始化成功\n");
}
else {
printf("\n初始化失败\n");
}
break;
case 2:
push(s);
break;
case 3:
pop(s);
break;
case 4:
if (StackHead(s)!=-1)
{
printf("\n栈顶元素为:%d\n", StackHead(s));
}
else {
printf("\n栈为空\n");
}
break;
case 5:
printf("\n栈的长度为:%d\n", Length(s));
break;
default:
flag = false;
break;
}
}
}
bool InitStack(Node *s) {
if (s==NULL)
{
return false;
}
s->next = NULL;
printf("输入初始化栈的长度:");
int len;
scanf("%d", &len);
Node *p;
srand((int)time(0));
//模仿单链表的头插法
for (int i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100;
p->next = s->next;
s->next = p;
}
return true;
}
void push(Node *s) {
//头插法进栈,通过获取栈顶元素判断元素是否进栈
printf("输入入栈元素:");
int data;
Node *p = (Node*)malloc(sizeof(Node));
scanf("%d", &data);
p->data = data;
p->next = s->next;
s->next = p;
printf("\n要想知道是否进栈,请输出栈顶元素!\n");
}
void pop(Node *s) {
Node *top = s->next;
Node *p;
//出栈
while (top)
{
p = top;
printf("%d ", p->data);
top = p->next;
free(p);//利用临时节点依次删除,遍历
}
s->next = NULL;
printf("\n");
}
int StackHead(Node *s) {
if (s->next==NULL)
{
return -1;
//判断栈是否为空
}
return s->next->data;//返回栈顶元素
}
int Length(Node *s) {
if (s==NULL)
{
return 0;//判断栈是否为空
}
Node *p = s->next;
int i = 0;
while (p)
{
i++;
p = p->next;//依次遍历栈,统计栈元素的数量
}
return i;
}