JZ-C-21

剑指offer第二十一题:包含min函数的栈

  1 //============================================================================
  2 // Name        : JZ-C-21.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : Hello World in C++, Ansi-style
  7 //============================================================================
  8 
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include <stack>
 12 #include <assert.h>
 13 using namespace std;
 14 template<typename T> class StackWithMin {
 15 public:
 16     StackWithMin<T>(void) {
 17     }
 18     ;
 19     ~StackWithMin<T>(void) {
 20     }
 21     ; //析构函数
 22     void push(const T& value);
 23     T& top(void);
 24     const T& top(void) const;
 25     void pop(void);
 26     const T& min(void) const;
 27     bool empty(void) const;
 28     size_t size() const;
 29 private:
 30     std::stack<T> dataStack; //存放数据
 31     std::stack<T> minStack; //存放最小值
 32 };
 33 template<typename T> void StackWithMin<T>::push(const T& value) {
 34     dataStack.push(value); //数据压入数据栈
 35     if (minStack.size() == 0 || value < minStack.top()) {
 36         minStack.push(value); //比较后压入最小值栈
 37     } else {
 38         minStack.push(minStack.top()); //若比最小值大,则重复压入最小值
 39     }
 40 }
 41 template<typename T> void StackWithMin<T>::pop() {
 42     assert(!minStack.empty() && !dataStack.empty()); //这里为什么要用assert?用法?
 43     dataStack.pop();
 44     minStack.pop();
 45 }
 46 template<typename T> const T& StackWithMin<T>::min() const {
 47     assert(dataStack.size() > 0 && dataStack.size() > 0);
 48 
 49     return minStack.top();
 50 }
 51 
 52 template<typename T> T& StackWithMin<T>::top() {
 53     return dataStack.top();
 54 }
 55 
 56 template<typename T> const T& StackWithMin<T>::top() const {
 57     return dataStack.top();
 58 }
 59 template<typename T> bool StackWithMin<T>::empty() const {
 60     return dataStack.empty();
 61 }
 62 
 63 template<typename T> size_t StackWithMin<T>::size() const {
 64     return dataStack.size();
 65 }
 66 
 67 void Test(char* testName, const StackWithMin<int>& stack, int expected) {
 68     if (testName != NULL)
 69         printf("%s begins: ", testName);
 70 
 71     if (stack.min() == expected)
 72         printf("Passed.\n");
 73     else
 74         printf("Failed.\n");
 75 }
 76 int main(int argc, char** argv) {
 77     StackWithMin<int> stack;
 78 
 79     stack.push(3);
 80     Test("Test1", stack, 3);
 81 
 82     stack.push(4);
 83     Test("Test2", stack, 3);
 84 
 85     stack.push(2);
 86     Test("Test3", stack, 2);
 87 
 88     stack.push(3);
 89     Test("Test4", stack, 2);
 90 
 91     stack.pop();
 92     Test("Test5", stack, 2);
 93 
 94     stack.pop();
 95     Test("Test6", stack, 3);
 96 
 97     stack.pop();
 98     Test("Test7", stack, 3);
 99 
100     stack.push(0);
101     Test("Test8", stack, 0);
102 
103     return 0;
104 }

 

转载于:https://www.cnblogs.com/Laughing-Lz/p/5578825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给出dosbox画圆程序的前半部分代码,为该代码添加注释,在结尾给出简易流程说明 data segment shuc db 'draw a yuan: $' hua1 db 'input yuanxin and banjing(example:310,220 200): $' zifu db 20 dup(0) ;此段用以临时存放输入字符 shu db 20 dup(0) ; suan db 24 dup(0) ;用来存放计算圆过程中产生的临时数据 data ends stack segment stk db 16 dup(0) stack ends code segment assume cs:code, ds:data,ss:stack start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov dx,offset shuc ;显示输入C的提示字符 call showmsg call input ;输入字符c的处理 mov al,ds:[si] and al,11011111b ;便于大小写都识别,将字符转换成大写 cmp al,43h draw1: mov dx,offset hua1 call showmsg call input call zhuanshu call moshi mov bx,offset shu mov ax,ds:[bx] mov si,ax mov ax,ds:[bx+2] mov di,ax mov ax,ds:[bx+4] call drawyuan mov ax,4c00h int 21h ;--------------------------------------- input: ;实现键盘输入字符 mov bx,0 mov cx,20 re: mov ah,1h ;DOS中断 键盘键入回显,al为字符 int 21h cmp al,0dh ;0dh为回车的ASCII码 jz scx mov si,offset zifu mov [bx][si],al ;将输入的字符放到zifu区 inc bx loop re ret ;-------------------------------------- scx: ;条件跳转时对cx设置 mov cx,0 ret ;-------------------------------------- showmsg: ;用来显示提示字符 mov ah,9h int 21h ret ;-------------------------------------- moshi: ;屏幕显示模式 mov al,12h mov ah,0 int 10h ret ;------------------------------------- zhuanshu: ;将输入的ascII码转为数字 mov bx,offset zifu mov bp,offset shu mov cx,16 mov si,0 mov di,0 lei: mov al,ds:[bx][si] cmp al,0 jz scx sub al,30h mov dl,100 mul dl mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+1] sub al,30h mov dl,10 mul dl add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+2] sub al,30h add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax add si,4 add di,2 loop lei ret
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值