简单的栈

栈是一种常见的数据结构,主要特点是“后进先出”。以下是用C语言实现的简单的栈。

头文件 stack.h ,定义栈的结构体和相关的操作:

#ifndef STACK_H
#define STACK_H

enum { STACK_OK = 0, STACK_OVERFLOW, STACK_ERROR, };

typedef int ElemType;

struct stack {
	ElemType *data;
	ElemType *top;
	int capability;
};

void stack_init(struct stack *st, int capability);
void stack_destroy(struct stack *st);
int stack_push(struct stack *st, ElemType elem);
int stack_pop(struct stack *st);
ElemType stack_top(const struct stack *st);
int stack_size(const struct stack *st);
int stack_capability(const struct stack *st);
int stack_full(const struct stack *st);
int stack_empty(const struct stack *st);
void stack_clear(struct stack *st);

#endif

C文件 stack.c,实现stack的相关操作。

#include "stack.h"
#include <assert.h>
#include <stdlib.h>

void stack_init(struct stack *st, int capability)
{
	assert(st && capability > 0);
	st->data = (ElemType *)malloc(sizeof(ElemType) * capability);
	assert(st->data);
	st->top = st->data;
	st->capability = capability;
}

void stack_destroy(struct stack *st)
{
	assert(st);
	if (st->data) 
		free(st->data);
	st->data = 0;
	st->top = 0;
	st->capability = 0;
}

int stack_push(struct stack *st, ElemType elem)
{
	assert(st);
	if (stack_full(st))
		return STACK_OVERFLOW;
	*(st->top++) = elem;
	return STACK_OK;
}

int stack_pop(struct stack *st)
{
	assert(st);
	if (stack_empty(st)) 
		return STACK_OVERFLOW;
	st->top--;
	return STACK_OK;
}

ElemType stack_top(const struct stack *st)
{
	assert(st);
	if (stack_empty(st))
		return (ElemType)0;
	else
		return *(st->top - 1);
}

int stack_size(const struct stack *st)
{
	assert(st);
	return (st->top - st->data);
}

int stack_capability(const struct stack *st)
{
	assert(st);
	return st->capability;
}

int stack_full(const struct stack *st)
{
	return (stack_size(st) == stack_capability(st));
}

int stack_empty(const struct stack *st)
{
	return (stack_size(st) == 0);
}

void stack_clear(struct stack *st)
{
	assert(st);
	st->top = st->data;
}

上面在stack.h 中定义了ElemType为int,是简单的数据类型。上面的实现也是针对简单数据库类型的,对于一些稍复杂的数据类型,上面的实现不适用。例如,如果栈元素需要用某个函数来销毁,则stack_clear就不适用了。

实现中也用到了assert,不过我不大喜欢用assert,因为会使程序中止。其实可以用if来作检测而不中止,或是不作检测,靠使用者自行判断。

上面实现也没有用到 STACK_ERROR 这个值。

下面是提供测试的main.c

#include <stdio.h>
#include "stack.h"

int main()
{
	struct stack st;
	int i;
	stack_init(&st, 5);

	printf("-------------- init stack ----------------\n");
	printf("stack capability: %d\n", stack_capability(&st));
	printf("stack size: %d\n", stack_size(&st));
	printf("stack empty ? %s\n", stack_empty(&st) ? "Y" : "N");
	printf("stack full ? %s\n", stack_full(&st) ? "Y" : "N");

	printf("-------------- pushing elements ----------------\n");
	for (i = 0; i < 10; ++i) {
		printf("push %i OK ? %s\n", i,
			(stack_push(&st, i) == STACK_OK ? "Y" : "N"));
		printf("stack size: %d\n", stack_size(&st));
		printf("stack empty ? %s\n", stack_empty(&st) ? "Y" : "N");
		printf("stack full ? %s\n", stack_full(&st) ? "Y" : "N");
	}

	printf("-------------- poping elements ----------------\n");
	while (!stack_empty(&st)) {
		printf("top: %d\n", stack_top(&st));
		printf("pop OK? %s\n", stack_pop(&st) == STACK_OK ? "Y" : "N");
		printf("stack size: %d\n", stack_size(&st));
		printf("stack empty ? %s\n", stack_empty(&st) ? "Y" : "N");
		printf("stack full ? %s\n", stack_full(&st) ? "Y" : "N");
	}

	printf("-------------- clear stack ----------------\n");
	stack_clear(&st);
	printf("stack capability: %d\n", stack_capability(&st));
	printf("stack size: %d\n", stack_size(&st));
	printf("stack empty ? %s\n", stack_empty(&st) ? "Y" : "N");
	printf("stack full ? %s\n", stack_full(&st) ? "Y" : "N");

	printf("-------------- destroy stack --------------\n");
	stack_destroy(&st);

	return 0;
}
时间: 2025-02-01 07:55:43

简单的栈的相关文章

hdu-1237简单计算器(栈的运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第一个运算符分别压 如个自的栈,然后判取出两个栈头部的元素,判断符号,如果是乘除就用当前数值乘取出的数字(优先),然后将乘后的数压入栈, 如果是加则将数和取出的数按原序入栈,如果减,就把新的数变负,将数和取出的数按原序入栈. 最后栈中所有元素的和就是结果. 1 #include<stdio.h> 2

PHP实现简单顺序栈

栈与数组:php数组也有压入压出的方法array_push 和array_shift.是不是数组就是栈数据结构?或者明明数组就可完成,为何还要栈 解答:去全国各地都可以用双腿走到,为何选择火车飞机?数组就是腿,栈就是火车飞机.首先不相等,其次栈可以让我们集中精力去解决更加核心的业务需求. 简单顺序栈实现 class Data{    private $data;     public function __construct($data){         $this->data=$data; 

简单的栈和队列

1 /* 2 入门之栈(Stack)和队列(Queue) 3 在C++中STL中预置了<stack>和<queue> 4 简单介绍栈和队列的思想和使用方法 5 栈:先入后出(LIFO),可以理解为将球放进一个一段封闭的管子,只能从入口区出,先进的球只能最后出来 6 队列:先入先出(FIFO),可以理解为将球放进不封闭的管子,球从另一端出来,先进的球先出 7 常见应用:栈可以用于深搜(DFS),队列可以用于宽搜(BFS) 8 只有看看例子就可以很好的理解栈和队列了,简单的先介绍这些

Objective-C实现一个简单的栈

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针. 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:栈中元素个数为零时称为空栈.插入一般称为进栈(PUSH),删除则称为退栈(POP).

Codeforces 344D Alternating Current 简单使用栈

Description Mad scientist Mike has just finished constructing a new device to search for extraterrestrial intelligence! He was in such a hurry to launch it for the first time that he plugged in the power wires without giving it a proper glance and st

逆波兰算法~简单理解栈

#include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<int> st;//初始化栈 string s; cin>>s; int x,y; for(int i=0;i<s.size();i++) { if(s[i]=='+') { x=st.top();//返回头部值 st.pop();//弹出 y=st.t

HDU 1237 简单计算器(栈)

题目链接 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00

c++:用顺序表实现简单的栈

main.cpp #include<iostream> #include<string> #include"Stack.hpp" using namespace std; void test1(){                     //测试 Stack<int> s1; s1.Push(1); s1.Push(2); s1.Push(3); s1.Push(4); s1.Pop(); s1.Pop(); s1.Pop(); s1.Pop();

简单计算器(栈)

欢迎参加——每周六晚的BestCoder(有米!) 简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14873    Accepted Submission(s): 5061 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试