赞
踩
栈的顺序表示和实现
栈结构体
top永远指向下一个
typedef struct Stack
{
DataType data[maxn]; // 作为栈元素的存储方式,数据类型为DataType
int top; // top即栈顶指针,data[top-1]表示栈顶元素,top==0代表空栈
int base; // base即栈底指针
} Stack; //构建一个名字是stack类型的结构体,包含三个部分
Stack *InitStack()
{
Stack *p = (Stack *)malloc(sizeof(Stack));
if (p == NULL)
return NULL; //分配失败返回空指针
p->base = p->top = 0; //栈底等于栈顶 即建立一个空栈
return p;
}
typedef enum
{
false,
true
} bool;
top永远指向下一个
bool StackPushStack(Stack *p, DataType dt)
{
if (p->top - p->base == maxn)
return false;
p->data[p->top] = dt; // dt存入栈中
p->top++; // 栈顶指针+1
return true;
}
bool StackPopStack(Stack *p)
{
if (p->base == p->top)
return false;
--p->top;
return true;
}
void StackClear(Stack *p)
{
p->top = 0; // 栈顶指针指向栈底
}
DataType StackGetTop(Stack *p)
{
return p->data[p->top - 1]; // 数组中栈元素从 0 开始计数,所以实际获取元素时,下标为 栈顶元素下标 减一;
}
int StackGetSize(Stack *p)
{
return p->top; // 因为只有在入栈的时候,栈顶指针才会加一,所以它正好代表了栈元素个数;
}
bool StackIsEmpty(Stack *p)
{
return !StackGetSize(p); //判断是否为空栈
}
void PrintStack(Stack *p) { if (StackIsEmpty(p)) { printf("栈为空\n"); } else { printf("从栈顶开始:\t"); for (int i = 1; i <= StackGetSize(p); i++) { printf("%d\t", p->data[p->top - i]); } } }
该程序分为两个文件,“Stack.h"与"test3.c”
将数据结构类型定义(typedef)部分与基础操作函数放在头文件Stack.h
主函数以及其他部分放在test3.c
中
#include <stdio.h> #include <stdlib.h> #define DataType int // DataType用这个宏定义来统一代表栈中数据的类型,这里将它定义为整型,根据需要可以定义成其它类型,例如浮点型、字符型、结构体 等等; #define maxn 1005 // 代表我们定义的栈的最大元素个数 #include "Stack.h" int main() { DataType e; Stack *p = InitStack(); printf("请输入栈元素(输入-1结束):"); scanf("%d", &e); while (e != -1) { StackPushStack(p, e); //printf("请输入栈元素(输入-1结束):"); scanf("%d", &e); } PrintStack(p); printf("\n"); printf("栈的大小为%d\n", StackGetSize(p)); printf("出栈测试:\n"); StackPopStack(p); PrintStack(p); printf("\n"); printf("取栈顶测试:\n"); e = StackGetTop(p); printf("取出的栈顶为%d\n", e); return 0; }
typedef enum { false, true } bool; typedef struct Stack { // 栈结构体 DataType data[maxn]; // 作为栈元素的存储方式,数据类型为DataType int top; // top即栈顶指针,data[top-1]表示栈顶元素,top==0代表空栈 int base; // base即栈底指针 } Stack; //构建一个名字是stack类型的结构体,包含三个部分 //初始化一个栈 Stack *InitStack() { Stack *p = (Stack *)malloc(sizeof(Stack)); if (p == NULL) return NULL; //分配失败返回空指针 p->base = p->top = 0; //栈底等于栈顶 即建立一个空栈 return p; } //入栈 bool StackPushStack(Stack *p, DataType dt) { if (p->top - p->base == maxn) return false; p->data[p->top] = dt; // dt存入栈中 p->top++; // 栈顶指针+1 return true; } //出栈 bool StackPopStack(Stack *p) { if (p->base == p->top) return false; --p->top; return true; } //清空栈 void StackClear(Stack *p) { p->top = 0; // 栈顶指针指向栈底 } // 只读接口,获取栈顶元素,获取栈大小,栈的判空, 打印栈 DataType StackGetTop(Stack *p) { return p->data[p->top - 1]; // 数组中栈元素从 0 开始计数,所以实际获取元素时,下标为 栈顶元素下标 减一; } int StackGetSize(Stack *p) { return p->top; // 因为只有在入栈的时候,栈顶指针才会加一,所以它 正好代表了 栈元素个数; } bool StackIsEmpty(Stack *p) { return !StackGetSize(p); //判断是否为空栈 } void PrintStack(Stack *p) { if (StackIsEmpty(p)) { printf("栈为空\n"); } else { printf("从栈顶开始:\t"); for (int i = 1; i <= StackGetSize(p); i++) { printf("%d\t", p->data[p->top - i]); } } }
Stack.h
中已实现的有关栈的基本操作函数来实现。请把该函数添加到文件test3.c
中的主函数前,并在主函数中添加相应语句进行测试。要求是回文串返回1,不是为0。int IsReverse(char *s) { int mid,len; Stack *q = InitStack(); len = strlen(s); mid = strlen(s)/2; for (int i = 0; i < mid; i++) { StackPushStack(q, s[i]); } for (int i = len%2?mid+1:mid ; i < len; i++) { if (StackGetTop(q) != s[i]) { return 0; } StackPopStack(q); } return 1; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define DataType int // DataType用这个宏定义来统一代表栈中数据的类型,这里将它定义为整型,根据需要可以定义成其它类型,例如浮点型、字符型、结构体 等等; #define maxn 1005 // 代表我们定义的栈的最大元素个数 #include "Stack.h" int IsReverse(char *s) { int mid,len; Stack *q = InitStack(); len = strlen(s); mid = strlen(s)/2; for (int i = 0; i < mid; i++) { StackPushStack(q, s[i]); } for (int i = len%2?mid+1:mid ; i < len; i++) { if (StackGetTop(q) != s[i]) { return 0; } StackPopStack(q); } return 1; } int main() { char s[15]; scanf("%s",s); if(IsReverse(s)) printf("是回文字符串\n"); else printf("不是回文字符串\n"); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。