入栈出栈操作

C语言实现入栈出栈操作

汇编中直接用PUSH和POP进行操作

C语言进行入栈和出栈操作显得更复杂

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct Node 
{
	int data;
	struct Node *next;
}StackNode;

typedef struct Stack
{
	StackNode *top;
	int count;
}StackQueue;

void initStack(StackQueue *S)
{
	S->top = (StackNode *)malloc(sizeof(StackNode));
	if (!S->top)
	printf("OverFlow !\n");
	S->top = nullptr;
}

void Push(StackQueue *S,int x)
{
	StackNode *p = (StackNode *)malloc(sizeof(StackNode));
	if (!p)
	exit(0);
	p->data = x;
	p->next = S->top;
	S->top = p;
}

int Pop(StackQueue *S)
{
	int x;
	StackNode *p = S->top;
	x = p->data;
	S->top = p->next;
	free(p);
	return x;
}

int Empty(StackQueue *S)
{
	return S->top == NULL;
}

int ExactPop(StackQueue *S)
{	
	StackNode *t = S->top;
	if (S->top)
	{
		S->top = t->next;
		S->top = t;
		if (!Empty(S))	
		return S->top->data;
	}
	return -1;
}

int main()
{
	StackQueue Q;
	StackQueue *N;
	N = &Q;
	initStack(N);
	printf("入栈元素为:\n");
	Q.count = 0;
	for (int i = 0; i < 5; i++)
	{
		Push(N,i);
		printf("%d ",i);
		Q.count++;
	}

	printf("\n栈顶元素为:%d",ExactPop(N));

	printf("\n出栈的结果为:\n");
		while (Q.count != 0)
		{
			printf("%d ",Pop(N));
			Q.count--;
		}
	if(ExactPop(N) == -1)
	printf("\n没有元素,不存在栈顶!\n");
	else
	printf("栈顶元素为:%d",ExactPop(N));
	getch();
}


另外

#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#define true        1
#define false       0
#define ok          1
#define error       0
#define infeasible  1
#define overflow    0
typedef struct{
	int *base;
	int *top;
	int stacksize;
}sqstack;

//函数说明
int createstack(sqstack *s);
int stackpush(sqstack *s);
void show(sqstack *s);
int stackpop(sqstack *s);


int  main()
{
	int j;  sqstack s;  createstack(&s);                        
	do                                 
	{
		printf("        ╔-----------------------------------------------╗\n");      //显示一个简易菜单
		printf("        ┆               main     menu                  ┆\n");	
		printf("        ┆             1      ---     创建(Insert)     ┆\n");
		printf("        ┆             2      ---     入栈(Update)     ┆\n");
		printf("        ┆             3      ---     出栈(Delete)     ┆\n");
		printf("        ┆             4      ---     退出( Show )     ┆\n");
		printf("        ╚-----------------------------------------------╝\n"); 
		printf("请输入所要进行的操作序号:  ");
		scanf("%d",&j);                                   //接受用户的选择
		switch(j)                                           //接受用户的函数    
		{case 1:{createstack(&s);printf("创建成功!\n");
		break;}
		case 2:{stackpush(&s);show(&s);
			break;}
		case 3:{stackpop(&s);show(&s);
			break;}
		case 4:break;
		default:printf("错误选择!请重选\n");break;
		}
	}while(j!=4);   	//直到i被赋值为4
	getch();
	return 0; 
}
//构造一个空栈
int createstack(sqstack *s)
{
	s->base=(int *)malloc(50*sizeof(int));  //开始分配50个整形空间
	if(!s->base) exit(overflow);
	s->top=s->base;
	s->stacksize=50;
	return ok;
}
//插入新元素为栈顶元素
int stackpush(sqstack *s)
{
	int e;
	if(s->top - s->base>=50){//栈满 ,追加存储空间
		s->base = (int *)realloc(s->base,(50+10)*sizeof(int));
		if(!s->base) exit(overflow);//存储分配失败
		s->top = s->base + 50;//新扩充空间后的栈顶指针位置
		s->stacksize += 10;
	}
	printf("请输入要入栈的值:");
	scanf("%d",&e);
	*s->top++ = e;
	return ok;
}
//出栈
int stackpop(sqstack *s)
{
	if(s->base == s->top) {printf("栈为空!不能出栈!"); return error;}
	--s->top;
	return ok;
}
//打印栈
void show(sqstack *s)
{
	int *ww;
	printf("The stack is :");
	ww=s->base;
	while(ww!=s->top){
		printf(" %d   ",*ww++);
	}
	printf("\n");
}







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值