现在的位置: 首页 > 综合 > 正文

链栈

2013年04月15日 ⁄ 综合 ⁄ 共 1579字 ⁄ 字号 评论关闭
//该程序的功能为模拟链栈(还有顺序栈,是用数组实现的)
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct node
{
	int date;
	struct node *pnext;
}NODE,* PNODE;
typedef struct stack
{
	PNODE ptop;
	PNODE pbottom;
}STACK,* PSTACK;

//初始化栈
void init(PSTACK);
//出栈操作
void push(PSTACK);
//判断栈是否为空
int isempty(PSTACK);
//遍历栈
void traverse(PSTACK);
//出栈操作
void pop(PSTACK);
//清空栈
void clear(PSTACK);

void menu(PSTACK ps)
{
	int item;
	printf("\n********************************模拟链栈******************************\n");
	while(1)
	{
		
		printf("\t\t1、入栈\n\t\t2、遍历栈\n\t\t3、出栈\n\t\t4、判断栈是否为空(无结果表示栈不空)\n\t\t5、清空栈\n\t\t6、清屏\n\t\t7、退出\n");
		printf("\t\t输入你的选择:\n");
		scanf("%d",&item);
		switch(item)
		{
		case 1:
			push(ps);
			break;
		case 2:
			traverse(ps);
			break;
		case 3:
			pop(ps);
			break;
		case 4:
			isempty(ps);
			break;
		case 5:
			clear(ps);
			break;
		case 6:
			system("cls");
			break;
		case 7:
			exit(0);
			break;
		default:
			printf("输入有误重新输入:\n");
			break;
		}
	}
}

int main()
{
	STACK s;
	init(&s);
	menu(&s);
	return 0;
}

//初始化栈,使得栈顶指针和栈底指针指向同一个节点,该节点的指针域为空
void init(PSTACK ps)
{
	ps->ptop=ps->pbottom=(PNODE)malloc(sizeof(NODE));
	ps->ptop->pnext=NULL;
}

//判断栈是否为空(链栈不存在栈满的问题)
int isempty(PSTACK ps)
{
	if(ps->ptop==ps->pbottom)
	{
		printf("栈空!\n");
		return 1;
	}
	return 0;
}

//入栈操作
void push(PSTACK ps)
{
	int i;
	PNODE p;
	p=(PNODE)malloc(sizeof(NODE));
	printf("输入入栈的数据(整形):\n");
	scanf("%d",&i);
	p->date=i;
	p->pnext=ps->ptop;
	ps->ptop=p;
	printf("入栈成功!\n");
}

//遍历栈
void traverse(PSTACK ps)
{
	PNODE p=ps->ptop;
	while(p->pnext!=NULL)
	{
		printf("\t%d",p->date);
		p=p->pnext;
	}
	printf("\n");
}

//出栈操作
void pop(PSTACK ps)
{
	if(!isempty(ps))
	{
		PNODE p=ps->ptop;//释放栈顶节点时用
		ps->ptop=ps->ptop->pnext;
		free(p);
		printf("栈顶元素出栈成功!\n");
	}
}

//清空栈
void clear(PSTACK ps)
{
	PNODE p;
	while(!isempty(ps))
	{
		p=ps->ptop;
		ps->ptop=ps->ptop->pnext;
		free(p);
	}
}

抱歉!评论已关闭.