c语言:顺序栈的应用(二) 判断回文数
2016-03-30 13:28
701 查看
#include<iostream>
#include<stdio.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
using namespace std;
typedef struct Stack //结构体定义
{
int *elem; //数据域
int top; //顺序栈栈顶
int stacksize; //顺序栈当前长度
}Stack;
//函数声明部分
void Error(char *s); //错误处理函数
void Init_Stack(Stack &l); //初始化顺序栈
void Destroy_Stack(Stack & l); //销毁顺序栈
void Push_Stack(Stack &L, int e); //压栈操作函数
int Pop_Stack(Stack &L, int e); //出栈操作函数
void Increment_Stack(Stack & l); //增加顺序栈空间函数
void Judge_Stack(Stack &l); //判断是否为回文数
//函数实现部分
void Error(char *s)
{
cout << s << endl;
exit(1);
}
void Init_Stack(Stack &l)
{
l.elem = new int[STACK_INIT_SIZE];
if (!l.elem)
Error("内存申请失败!");
l.top = -1;
l.stacksize = STACK_INIT_SIZE;
}
void Destroy_Stack(Stack &l)
{
delete[] l.elem;
l.top = -1;
l.stacksize = 0;
cout << "该顺序栈销毁成功!" << endl;
}
void Increment_Stack(Stack &l)
{
int *newstack = new int[l.stacksize + STACK_INCREMENT];
if (!newstack)
Error("存储分配失败!");
for (int i = 0; i < l.top; i++)
{
newstack[i] = l.elem[i];
}
l.elem = newstack;
delete[] l.elem;
l.stacksize += STACK_INCREMENT;
}
void Push_Stack(Stack &l, int e)
{
if (l.top == (l.stacksize - 1))
Increment_Stack(l);
l.elem[++l.top] = e;
}
int Pop_Stack(Stack &l, int e)
{
if (l.top == -1)
Error("该顺序栈为空栈!");
return e = l.elem[l.top--];
}
void Judge_Stack(Stack *s) //判断是否是回文数函数
{
Init_Stack(*s); //初始化顺序栈
char t[250]; //申请内存
cout << "请输入要判断的数:" << endl;
cin >> t;
int i, len;
int e = 0;
char temp;
len = strlen(t); //计算回文数长度
for (i = 0; i <len / 2; i++) //将回文数的一半压栈
{
Push_Stack(*s, t[i]);
}
if (len % 2 == 1) //判断字符长度是奇数还是偶数,奇数加一
i++;
while (s->top>-1)
{
temp = Pop_Stack(*s, e); //将压入栈的元素出栈,赋给temp
if (temp != t[i]) //比较两个字符的大小
{
cout << "该数不是回文数!"<<endl; //第一个不相等就直接跳出,没必要比较后面的部分
exit(1);
}
else //否则继续比较大小,直到结束
i++;
}
cout << "该数是回文数!" << endl;
}
int main()
{
Stack s;
Judge_Stack(&s);
}
#include<stdio.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
using namespace std;
typedef struct Stack //结构体定义
{
int *elem; //数据域
int top; //顺序栈栈顶
int stacksize; //顺序栈当前长度
}Stack;
//函数声明部分
void Error(char *s); //错误处理函数
void Init_Stack(Stack &l); //初始化顺序栈
void Destroy_Stack(Stack & l); //销毁顺序栈
void Push_Stack(Stack &L, int e); //压栈操作函数
int Pop_Stack(Stack &L, int e); //出栈操作函数
void Increment_Stack(Stack & l); //增加顺序栈空间函数
void Judge_Stack(Stack &l); //判断是否为回文数
//函数实现部分
void Error(char *s)
{
cout << s << endl;
exit(1);
}
void Init_Stack(Stack &l)
{
l.elem = new int[STACK_INIT_SIZE];
if (!l.elem)
Error("内存申请失败!");
l.top = -1;
l.stacksize = STACK_INIT_SIZE;
}
void Destroy_Stack(Stack &l)
{
delete[] l.elem;
l.top = -1;
l.stacksize = 0;
cout << "该顺序栈销毁成功!" << endl;
}
void Increment_Stack(Stack &l)
{
int *newstack = new int[l.stacksize + STACK_INCREMENT];
if (!newstack)
Error("存储分配失败!");
for (int i = 0; i < l.top; i++)
{
newstack[i] = l.elem[i];
}
l.elem = newstack;
delete[] l.elem;
l.stacksize += STACK_INCREMENT;
}
void Push_Stack(Stack &l, int e)
{
if (l.top == (l.stacksize - 1))
Increment_Stack(l);
l.elem[++l.top] = e;
}
int Pop_Stack(Stack &l, int e)
{
if (l.top == -1)
Error("该顺序栈为空栈!");
return e = l.elem[l.top--];
}
void Judge_Stack(Stack *s) //判断是否是回文数函数
{
Init_Stack(*s); //初始化顺序栈
char t[250]; //申请内存
cout << "请输入要判断的数:" << endl;
cin >> t;
int i, len;
int e = 0;
char temp;
len = strlen(t); //计算回文数长度
for (i = 0; i <len / 2; i++) //将回文数的一半压栈
{
Push_Stack(*s, t[i]);
}
if (len % 2 == 1) //判断字符长度是奇数还是偶数,奇数加一
i++;
while (s->top>-1)
{
temp = Pop_Stack(*s, e); //将压入栈的元素出栈,赋给temp
if (temp != t[i]) //比较两个字符的大小
{
cout << "该数不是回文数!"<<endl; //第一个不相等就直接跳出,没必要比较后面的部分
exit(1);
}
else //否则继续比较大小,直到结束
i++;
}
cout << "该数是回文数!" << endl;
}
int main()
{
Stack s;
Judge_Stack(&s);
}
相关文章推荐
- 【Python】SWIG 和 Python——c/c++与脚本交互
- C++编译器函数模版机制剖析 - 函数模版的本质
- c++涉及继承和虚继承时的内存布局
- 作业:C++作业2
- 二分查找C++
- C++学习日志第四篇
- C++ 容器及选用总结
- 钻石型虚拟多重继承的C++对象内存模型
- 2016.3.29 360c++ 研发编程第二题
- 2016.3.29 360c++ 研发编程第一题
- C语言格式输入函数scanf()详解
- 1.c++笔记---有趣的bool型
- 【poj 1260】Pearls 题意&题解&代码(C++)
- c语言复习2值指针实战
- 复利计算程序单元测试(C语言)
- C++和Java中字符串操作
- C++ ofstream和ifstream详细用法
- c++ const 类
- 【C/C++】引用和指针的区别
- c++ 链表类创建 demo