#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef struct Node *PNode; /* 指向结点的指针类型 */
struct Node{
int info;
PNode link;
};
/* 链栈类型定义*/
struct LinkStack{ /*为了强调栈顶是栈的一个属性,对栈增加了一层封装*/
PNode top;
};
typedef struct LinkStack *PLinkStack;
PLinkStack createEmptyStack_link(void) /*创建一个空链栈*/
{
PLinkStack plstack;
plstack = (PLinkStack)malloc(sizeof(struct LinkStack)); /* 申请 struct LinkStack 结构的空间 */
if(plstack!=NULL)
plstack->top=NULL;
else
printf("Out of space!!\n"); /*创建失败 */
return plstack;
}
int isEmptyStack_link(PLinkStack plstack) /*判断单链式栈是否为空*/
{
return(plstack->top==NULL);
}
/*进栈*/
void push_link(PLinkStack plstack,int x) /* 在栈中压入一个元素 */
{
PNode p;
p=(PNode)malloc(sizeof(struct Node)); /* 申请结点空间*/
if(p==NULL){
printf("Out of space!!!\n");
}
else{
p->info=x;
p->link=plstack->top;
plstack->top=p;
}
}
void pop_link(PLinkStack plstack) /*出栈*/
{
PNode p;
if(isEmptyStack_link(plstack))
printf("Empty stack pop.\n");
else{
p=plstack->top;
plstack->top=p->link; /*当栈不空时直接修改栈顶指针,删除结点 */
free(p);
}
}
int top_link(PLinkStack plstack) /*取栈顶元素*/
{
if(plstack->top==NULL)
printf("Stack is empty\n"); /* 当不空时取出栈顶元素的值,,栈保持不变*/
else
return(plstack->top->info);
}
int main()
{
int a,m=1;
printf("栈链式的大小:\n");
scanf("%d",&a);
PLinkStack A;
A=createEmptyStack_link(); /* A=isEmptyStack_link(A) 若为空栈返回值为1,若不为空返回值
为0 \n"); */
while(m==1){
printf("请选择你需要的操作:\n");
printf("1:打印:\n");
printf("2:入栈:\n");
printf("3:出栈:\n");
printf("4:取栈顶元素:\n");
int op;
int k,q;
PNode p;
scanf("%d",&op);
switch(op){
case 1:
printf("打印:\n");
p=A->top;
while(p!=NULL){
printf("%d ",p->info);
p=p->link;
}
break;
case 2:
printf("入栈");
for(q=0;q<a;q++){
printf("\n请继续输入:");
scanf("%d",&k);
push_link(A,k);
}
break;
case 3:
printf("出栈:\n");
printf("%d\n",A->top->info);
pop_link(A);
break;
case 4:
printf("取栈顶元素:\n");
top_link(A);
printf("%d\n",A->top->info);
break;
}
printf("\n需要继续操作请输入“1”,退出输入“0”\n");
scanf("%d",&m);
}
printf("\ 退出操作");
}
#include <stdlib.h>
struct Node;
typedef struct Node *PNode; /* 指向结点的指针类型 */
struct Node{
int info;
PNode link;
};
/* 链栈类型定义*/
struct LinkStack{ /*为了强调栈顶是栈的一个属性,对栈增加了一层封装*/
PNode top;
};
typedef struct LinkStack *PLinkStack;
PLinkStack createEmptyStack_link(void) /*创建一个空链栈*/
{
PLinkStack plstack;
plstack = (PLinkStack)malloc(sizeof(struct LinkStack)); /* 申请 struct LinkStack 结构的空间 */
if(plstack!=NULL)
plstack->top=NULL;
else
printf("Out of space!!\n"); /*创建失败 */
return plstack;
}
int isEmptyStack_link(PLinkStack plstack) /*判断单链式栈是否为空*/
{
return(plstack->top==NULL);
}
/*进栈*/
void push_link(PLinkStack plstack,int x) /* 在栈中压入一个元素 */
{
PNode p;
p=(PNode)malloc(sizeof(struct Node)); /* 申请结点空间*/
if(p==NULL){
printf("Out of space!!!\n");
}
else{
p->info=x;
p->link=plstack->top;
plstack->top=p;
}
}
void pop_link(PLinkStack plstack) /*出栈*/
{
PNode p;
if(isEmptyStack_link(plstack))
printf("Empty stack pop.\n");
else{
p=plstack->top;
plstack->top=p->link; /*当栈不空时直接修改栈顶指针,删除结点 */
free(p);
}
}
int top_link(PLinkStack plstack) /*取栈顶元素*/
{
if(plstack->top==NULL)
printf("Stack is empty\n"); /* 当不空时取出栈顶元素的值,,栈保持不变*/
else
return(plstack->top->info);
}
int main()
{
int a,m=1;
printf("栈链式的大小:\n");
scanf("%d",&a);
PLinkStack A;
A=createEmptyStack_link(); /* A=isEmptyStack_link(A) 若为空栈返回值为1,若不为空返回值
为0 \n"); */
while(m==1){
printf("请选择你需要的操作:\n");
printf("1:打印:\n");
printf("2:入栈:\n");
printf("3:出栈:\n");
printf("4:取栈顶元素:\n");
int op;
int k,q;
PNode p;
scanf("%d",&op);
switch(op){
case 1:
printf("打印:\n");
p=A->top;
while(p!=NULL){
printf("%d ",p->info);
p=p->link;
}
break;
case 2:
printf("入栈");
for(q=0;q<a;q++){
printf("\n请继续输入:");
scanf("%d",&k);
push_link(A,k);
}
break;
case 3:
printf("出栈:\n");
printf("%d\n",A->top->info);
pop_link(A);
break;
case 4:
printf("取栈顶元素:\n");
top_link(A);
printf("%d\n",A->top->info);
break;
}
printf("\n需要继续操作请输入“1”,退出输入“0”\n");
scanf("%d",&m);
}
printf("\ 退出操作");
}