王道书籍上栈的基本操作和课后部分习题
代码如下:
/** * @author Dawn * @date 2019年11月9日21:52:16 * @version 1.0 * 栈的复习,由于函数不是很多,就写在一起算了 */ #include<stdio.h> #include<stdlib.h> #define MaxSize 50//栈中元素最大个数 typedef int ElemType; typedef struct { ElemType data[MaxSize];//存放栈中元素 int top;//栈顶指针 }SqStack; //仅仅是为了写第四题 typedef struct LNode{ ElemType data; struct LNode* next; }LNode,*LinkList; //仅仅为了第五题 共享栈 typedef struct { ElemType data[MaxSize];//共享栈 int top[2];//2个栈顶指针 }ShareStack; //============栈的基本操作定义=============== //1.初始化 void InitStack(SqStack& S); //2.判栈空 bool StackIsEmpty(SqStack S); //3.进栈 bool Push(SqStack& S, ElemType x); //4.出栈 bool Pop(SqStack& S,ElemType &x); //5.读栈顶元素,将读取的结果放在x中 bool GetTop(SqStack S, ElemType& x); int arrlen(int arr[]) { int length = 0; while (arr[length]>0) { length++; } return length; } //============课后习题定义=============== //3.简陋版的符号匹配问题,也就是只有一种括号()。 bool Judge(char A[]); bool Judge2(char A[]); //这里进行升级,也就是判断([()()])这种的问题 将(看成 1 。[ 看成 2 。)看成 11。]看成22 bool Judge3(int A[]); //4.判断一个链表是否对称,用栈的思想来完成 bool IsSymmetry(LinkList L,int n); //5.共享栈的设计,包括它的入栈和出栈操作 //i 表示栈号(0,1这2个栈),x表示入栈的元素 bool Push_S(ShareStack& S, int i, ElemType x); bool Pop_S(ShareStack& S, int i, ElemType& x); int main() { int arr[5] = { 1,2,3,4,5 }; SqStack S; int i = 0; int x; //InitStack(S); //printf("栈是否为空:%s ", StackIsEmpty(S) ? "为空" : "不为空"); //while (i < 5) { // Push(S, arr[i++]); //} //printf("栈是否为空:%s ", StackIsEmpty(S) ? "为空" : "不为空"); ////GetTop(S, x); ////printf("栈顶元素为:%d", x); //Pop(S, x); //printf("出栈的元素为:%d", x); ////课后习题测试 //printf(" "); //char A[7] = { 'O','O','I','I','O','O' }; ////Judge(A); //Judge2(A); int arr2[] = { 1,2,1,11,1,11,22,11 }; //([()()]) int len = arrlen(arr2); printf("length: %d ", len); printf("括号是否正确:%s ", Judge3(arr2) ? "正确" : "错误"); return 0; } //============课后习题实现=============== //3.算是栈的应用 简陋版的符号匹配问题, bool Judge(char A[]) { //思路?遍历数组,用 j k分别代表入栈I和出栈O的个数。然后通过这个次数来判断是否符合栈的规则 int i = 0; int j = 0, k = 0; while (A[i] != '