顺序栈
#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)));
}//算法结束