栈的链式结构
链表节点
typedef struct node {
char c; // 数据
struct node *next; // 指针
}node, *pt;
栈顶指针
typedef struct stack {
pt top; // 指向栈顶
int count; // 可用来记录栈的大小
}stack;
入栈操作
void in (char c, stack * p) // c为数据, *p为栈顶指针的指针,用来改变栈顶指针的值
{
pt current;
current = (pt) malloc (sizeof(node)); // 新建节点
current->next = (*p).top; // 新建的节点指向上一个新建的节点
current->c = c; // 数据赋值
(*p).top = current; // 改变站顶指针,使其指向新建的节点。
(*p).count++; // 栈长度计数自增
}
出栈操作
void out (char * c, stack * p) // 将c的指针传入,用来传递出栈的值。将栈顶指针的指针传入。
{
pt prev;
prev = (*p).top; // 先记录下要出栈释放的节点。
if ((*p).top->next == NULL) // 如果栈为空栈则返回空格
{
*c = 32;
return ; // 空栈则跳出函数
}
*c = (*p).top->c; // 值传递,将出栈的值传出。
(*p).top = (*p).top->next; // 栈顶指向栈的上个节点
(*p).count--; // 计数器自减
free(prev) ; // 释放出栈的节点
}
遍历栈并输出
void print(stack p)
{
pt current = (*p).top; // 指向栈顶的节点
while (current != NULL)
{
putchar(current->c) ;
current = current->next;
}
printf("\n");
}
具体测试
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
char c;
struct node *next;
}node, *pt;
typedef struct stack {
pt top;
int count;
}stack;
void creat (stack * p);
void in (char c, stack * p);
void out (char * c, stack * p);
void print( stack p);
int main ()
{
char c;
stack p;
creat(&p);
while(scanf("%c", &c) != EOF)
{
getchar();
in(c, &p);
}
print(p);
while(1)
{
getchar();
out(&c, &p);
if (c == 32) break;
printf("出栈%c\n", c);
print(p);
}
}
void creat (stack * p)
{
(*p).top = NULL;
(*p).count = 0;
}
void in (char c, stack * p)
{
pt current;
current = (pt) malloc (sizeof(node));
current->next = (*p).top;
current->c = c;
(*p).top = current;
(*p).count++;
}
void out (char * c, stack * p)
{
pt prev;
prev = (*p).top;
*c = (*p).top->c;
if ((*p).top->next == NULL)
{
*c = 32;
return ;
}
(*p).top = (*p).top->next;
(*p).count--;
free(prev) ;
}
void print(stack p)
{
pt current = p.top;
while (current != NULL)
{
putchar(current->c) ;
current = current->next;
}
printf("\n");
}
测试结果