顺序栈-数据结构

顺序栈

#define _CAT_SECURE_NO_WARNINGS
#include "iostream"
#include "stdlib.h"
#include "windows.h"
using namespace std;
#define OK 1
#define ERROR 0
#define M 100
typedef int ElemType;

typedef char SElemType;
//顺序栈存储结构
typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//顺序栈操作集合
ElemType InitStack(SqStack &S);//初始化栈 //ok
int StackEmpty(SqStack S);//判栈空 //ok
int StackFull(SqStack S);//判栈满 //ok
int Push(SqStack &S, SElemType e);//压栈 顺序栈的入栈 //ok
int Pop(SqStack &S, SElemType &e);//弹栈 顺序栈的出栈//ok
void TraverseStack(SqStack S);//遍历栈
SElemType GetElem(SqStack S);//取栈顶元素 //ok
int StackLength(SqStack S);//求栈的长度 //ok
void ClearStack(SqStack &S);//清空栈	
int Judge(char A[]);
int Ack(int m, int o);
//int OperatorCorrect(SqStack &S, char *s);//应用实践

void f() {
	SqStack S;
	InitStack(S);
	Push(S, 'a');
	Push(S, 'b');
	Push(S, 'c');
	TraverseStack(S);
	system("pause");
}

int main() {
	f();
	return ERROR;
}

ElemType InitStack(SqStack & S)
{ //构造一个空栈S,为顺序栈动态分配一个预定义大小的数组空间
	S.base = new SElemType[M];
	if (!S.base) {
		exit(OVERFLOW);
		return ERROR;
	}
	S.top = S.base;
	S.stacksize = M;
	return OK;
}

int StackEmpty(SqStack S)
{
	if (S.top == S.base)
		return OK;
	return ERROR;
}

int StackFull(SqStack S)
{
	if (S.top - S.base == S.stacksize)
		return OK;
	return ERROR;
}

int Push(SqStack & S, SElemType e)
{ //插入元素e为新的栈顶元素
	if (S.top - S.base == S.stacksize)
		return ERROR;
	*S.top++ = e;
	return OK;
}

int Pop(SqStack & S, SElemType & e)
{ //删除S的栈顶元素,用e返回其值
	if (S.top == S.base)
		return ERROR;
	e = *(--S.top);//栈顶指针减一,将栈顶元素赋给e
	return OK;
}

void TraverseStack(SqStack S)
{
	if (StackEmpty(S))
		exit(0);
	SElemType *p = S.base;
	while (p < S.top)
		cout << *--S.top << " ";
	cout << endl;
}

SElemType GetElem(SqStack S)
{ //返回S的栈顶元素,不修改栈顶指针
	if (S.top != S.base)
		return *(S.top - 1);
}

int StackLength(SqStack S)
{
	ElemType Sum = 0;
	SElemType *p = S.base;
	while (p < S.top) {
		Sum++;
		p++;
	}
	return Sum;
}

void ClearStack(SqStack & S)
{
	S.top = S.base;
}
/*
int OperatorCorrect(SqStack & S, char *str)
{
	int i = 0;
	SqStack S;
	InitStack_sq(S);
	while (str[i] != '\0') {
		if (str[i] == 'I')
			Push_sq(S.str[i]);
		else {
			if (StackEmpty_sq(S))
				return ERROR;
			SElemType e;
			Pop_sq(S, e);
		}
	}
	return 0;
}*/

int Judge(char A[])
//判断字符数组A中的输入输出序列是否是合法序列。如是,返回true,否则返回false。
{
	int i = 0;                //i为下标。
	int j = 0, k = 0;              //j和k分别为I和字母O的的个数。
	while (A[i] != '\0') //当未到字符数组尾就作。
	{
		switch (A[i])
		{
		case 'I': j++; break; //入栈次数增1。
		case 'O':
			k++;
			if (k > j) {
				cout << "序列非法" << endl;
				exit(0);
			}
		}
		i++; //不论A[i]是‘I’或‘O’,指针i均后移。}
		if (j != k) {
			cout << "序列非法" << endl;
			return(false);
		}
		else {
			cout << "序列合法" << endl;
			return(true);
		}
	}//算法结束。
}

int Ack(int m, int o)
{
	if (m == 0)
		return(o + 1);
	else if (m != 0 && o == 0)
		return(Ack(m - 1, 1));
	else
		return(Ack(m - 1, Ack(m, m - 1)));
}//算法结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值