实验目的:
实验任务与要求: ⑴ 定义栈的顺序存储表示 ⑵ 基于所设计的存储结构实现栈的基本操作 ⑶ 编写一个主程序对所实现的栈进行测试 ⑷ 栈的应用:编程实现括号匹配的检验 实验内容 : 1、采用书上第 46 页定义的栈的顺序存储表示,编程实现栈的下列基本操作。 (1)初始化顺序栈 (2)创建顺序栈 (3)判断栈空 (4)输出顺序栈 (5)取栈顶元素 (6)入栈 (7)出栈 2、采用栈的顺序存储表示,编程实现表达式中圆括号“( )”和方括号“[ ]”匹配的检验。 程序清单: 第一题: #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include <stdio.h> #define TRUE 1 #define FALSE 1 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCERMENT 10 typedef int Status; typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack; Status InitStack(SqStack& S) { //构造一个空栈S S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }//InitStack Status StackEmpty(SqStack& S) { if (S.base == S.top) return TRUE; else return FALSE; }//StackEmpty Status GetTop(SqStack& S, SElemType& e) { //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR; if (S.top == S.base)return ERROR; e = *(S.top - 1); return OK; }//GetTop Status Push(SqStack& S, SElemType e) { //插入元素e为新的栈顶元素 if (S.top - S.base >= S.stacksize) { //栈满,增加存储空间 S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCERMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW);//存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCERMENT; } *S.top++ = e; return OK; }//push Status Pop(SqStack& S, SElemType& e) { //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR; if (S.top == S.base)return ERROR; e = *--S.top; return OK; }//Pop Status Stackoutput(SqStack& S) { //若栈不空,则从栈顶到栈底输出数据元素,返回OK;否则返回ERROR; SElemType* p; if (S.top == S.base)return ERROR; p = S.top; while (p!= S.base) { printf("%d ", *(p-1)); p--; } return OK; }//Stackoutput Status StackTraverse(SqStack& S) { //若栈不空,则从栈底到栈顶输出数据元素,返回OK;否则返回ERROR; SElemType* p; if (S.top == S.base)return ERROR; p = S.base; while (p!= S.top) { printf("%d ", *p); p++; } return OK; }//StackTraverse void main() { int i, n, h, k, a, b; SqStack S; printf("创建一个空栈!\n"); InitStack(S); printf("判断栈是否为空!\n"); printf("StackEmpty(S)=%d\n", StackEmpty(S)); printf("创建栈的元素个数:\n"); scanf("%d", &n); printf("输出%d个入栈元素的值:\n", n); for (i = 0; i < n; i++) { scanf("%d", &k); Push(S, k); } printf("逆序输出顺序栈元素值:\n"); Stackoutput(S); printf("\n"); printf("输出顺序栈元素值:\n"); StackTraverse(S); printf("\n"); printf("输入入栈元素值:\n"); scanf("%d", &h); Push(S, h); printf("输出入栈后的顺序栈元素:\n"); StackTraverse(S); Pop(S, a); printf("\n"); printf("输出第一个栈元素值:%d\n", a); Pop(S, a); printf("输出第二个栈元素值:%d\n", a); printf("输出两次出栈后顺序栈元素值:\n"); StackTraverse(S); GetTop(S, b); printf("\n"); printf("输出栈顶元素值:%d\n", b); } 第二题: #include<iostream> using namespace std; #include<string> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_ININ_SIZE 100 typedef char SElemType; typedef int Status; typedef struct { SElemType* top; SElemType* base; int stacksize; }sqstack; Status InitStack(sqstack& s) { s.base = new SElemType; if (!s.base) exit(OVERFLOW); s.top = s.base; s.stacksize = STACK_ININ_SIZE; return OK; } Status IsEmpty(sqstack& s) { if (s.top == s.base) return ERROR; else return OK; } Status Push(sqstack& s, SElemType e) { *s.top = e; s.top++; return OK; } Status Pop(sqstack& s, SElemType& e) { if (s.top == s.base) return ERROR; s.top--; e = *s.top; return OK; } Status Correct(SElemType str[]) { sqstack s; InitStack(s); int i; int state = 1; SElemType e; for (i = 0; str[i] != '\0'; i++) { switch (str[i]) { case '(':Push(s, str[i]); break; case '[':Push(s, str[i]); break; case ')': if (Pop(s, e) == OK) { if (e != '(') state = 0; } else { state = 0; } break; case ']': if (Pop(s, e)) { if (e != '[') state = 0; } else { state = 0; } break; } if (!state) { break; } } if (!IsEmpty(s) && state == 1) return OK; else return ERROR; } int main() { SElemType str[100]; cout << "请输入带括号的表达式:" << endl; cin >> str; if (Correct(str) == OK) cout << "括号匹配正确!" << endl; else cout << "括号匹配不正确!" << endl; return 0; } 运行情况: 第一题: 第二题: |
04 栈的实现和应用
最新推荐文章于 2024-07-24 14:54:00 发布